mmu相关内容
我在我的 s3c2440 板上启用了 MMU(3G - 4G 内存 :: 故障属性),当我没有读/写 3G - 4G 内存时一切都很好.所以为了测试页面故障向量,我写信给3G地址的0xFF,正如我所料,我从FSR得到了正确的值,所以我在_do_page_fault()中做了这个,步骤是这样的: .....//将新页面设置为转换表......invlidate_icache ();//清空缓存cl
..
一般来说,我知道一个进程无法写入具有不允许写入的保护的内存(在其地址空间中).但是什么检查进程是否可以做到这一点?是否有任何汇编指令通过操作系统?它是如何工作的? 解决方案 在大多数现代 CPU(Intel x86,大多数 ARM 版本)中,是 CPU 本身进行检查.CPU在寄存器之一中存储数据结构的地址,该地址指定存储器的布局(“页表")——具体而言,哪些地址是可读的,哪些是可写的,哪些
..
在单核计算机上,一次执行一个线程.在每次上下文切换时,调度程序都会检查要调度的新线程是否与前一个线程在同一进程中.如果是这样,则无需对 MMU(页表)进行任何操作.在另一种情况下,需要使用新的进程页表来更新页表. 我想知道在多核计算机上会发生什么事情.我猜每个核心上都有一个专用的MMU,如果同一进程的两个线程同时在2个核心上运行,那么这个核心的每个MMU都只是引用同一个页表.这是真的 ?你能
..
我对Linux内核页表管理感到困惑? 在Linux内核空间,页表开启之前.内核将运行在具有 1-1 映射机制的虚拟内存中.页表打开后,内核会参考页表将虚拟地址转换为物理内存地址.问题是: 此时开启页表后,内核空间还是1GB(从0xC0000000 - 0xFFFFFFFF)? 并且在内核进程的页表中,只有 0xC0000000 - 0xFFFFFFFF 范围内的页表条目 (PTE
..
我正在阅读操作系统概念,我正在阅读第 8 章!但是,我可以使用一些澄清或保证我的理解是正确的. 逻辑地址:根据本书,逻辑地址由 CPU 生成.这到底是什么意思?(在执行生成的地址系统中......)我假设当为程序编译代码时,程序不知道代码将在哪里加载到内存中.编译器所做的只是设置程序布局的总体草图以及图像的布局方式,但不会为其分配任何实际地址.当程序执行时,CPU 获取编译器制作的这个布局图
..
我只是想澄清这个概念,并且可以找到足够详细的答案,这些答案可以对硬件中的一切实际运作方式有所了解.请提供任何相关详细信息. 在 VIPT 缓存的情况下,内存请求并行发送到 TLB 和缓存. 从 TLB 中我们得到了被翻译的物理地址.从缓存索引中,我们得到一个标签列表(例如,来自属于一个集合的所有缓存行). 然后将翻译后的 TLB 地址与标签列表进行匹配以找到候选者. 我的问
..
在“低级编程:英特尔® 64 位架构上的 C、汇编和程序执行"一书中,我读到: 每个虚拟 64 位地址(例如,我们在程序中使用的地址)由几个字段组成.地址本身实际上只有 48 位宽的;它被符号扩展为 64 位规范地址.它的特点是它的左17位是相等的.如果条件是不满意,地址在使用时立即被拒绝.然后48 位虚拟地址转换为 52 位物理地址在特殊表的帮助下寻址. 为什么虚拟地址和物理地址相差
..
我对 linux 如何利用 ARMv7 MMU 硬件进行 3 级页表遍历并不感到困惑.MMU 只有 2 个寄存器 ttbr0 和 ttbr1(一个用于内核,另一个用于用户空间).mmu是怎么知道linux的多级页表遍历的? 谢谢,高 解决方案 如果虚拟地址的高 N 位都为零,则转换从 TTBR0 else 开始TTBR1.N 来自 TTBCR.TTBRn 寄存器包含一级表基址的物理地
..
Linux 内核虚拟地址一对一映射.因此,通过将 PAGE_OFFSET 减去虚拟地址,我们将获得物理地址.这就是 virt_to_phys 和
..
ARM720T 用户手册提到了小页面和大页面.既然 ARM 720T 需要一个 64KB 的页表条目在页表中复制 16 次,为什么不放置 16 个小页 (4KB) 条目来模拟 64KB 的页条目,而不是首先使用大页? 解决方案 来自 ARM720 TRM, 大页面由 64KB 内存块组成.大页面是支持允许映射大范围的内存中只使用一个条目TLB).扩展了额外的访问控制机制到 16KB
..
这个问题与这个问题有关:虽然“fork";对于一个进程,为什么Linux内核会为每个新创建的进程复制内核页表的内容? 我发现 Linux 内核试图通过将交换页表的内容复制到函数 pgd_alloc 中每个新创建的页表中来避免在用户态和内核态之间切换时更新 TTBR.问题是:更新 ARM TTBR 的缺点是什么? 解决方案 更新 TTBR(翻译表基址寄存器)Note1 并启用 MMU
..
背景 我想要一个在普通世界中运行的丰富的GNU/Linux操作系统和一个在普通世界中运行的带有集成监视器的小型操作系统安全世界. 要求 我们必须绝对避免正常世界来访问安全世界内存区域. 问题 我们需要使用/激活 TrustZone 的哪些功能来满足此要求?我只想使用必要的功能来最大限度地减少所需的工作. 详情 我已经阅读了很多 ARM TrustZone
..
我研究了在linux上禁用内核文本写保护的主题,我只能找到x86 linux的解决方案,即临时清除cr0寄存器的第16位,写入内存,然后设置再次是 cr0 寄存器的第 16 位.但是,这不适用于 ARMv6 及更高版本.此页面中的一个示例:Linux 内核:系统调用挂钩示例. cr0 寄存器不存在于 ARM 体系结构中,并且链接中的答案中陈述的一些函数,例如 lookup_address、c
..
参考Linux 内核 ARM 转换表库(TTB0 和 TTB1) 我对上一个链接中讨论的主题有父亲的疑问/疑问: 0 到 0xbffffffff 是内存的较低部分(用于用户进程),由 TTB0 中的页表管理,它包含当前进程的页表 参考arm/include/asm/pgtable-2level.h : PTRS_PER_PGD =2048, PTRS_PER_PMD =1, PTRS
..
根据一些教程,我们会在bootlaoder开始时禁用MMU和I/D-Caches.如果我理解正确,它的目的是在程序中直接使用物理地址,所以如果我错了,请纠正我.谢谢! 其次,我们这样做是为了禁用 MMU 和缓存: mrc P15, 0, R0, C1, C0, 0 bic R0, R0, #0x00002300 @ 清除位 13, 9:8 bic R0, R0, #0x00
..
简而言之,我想关闭 Linux 上下文中的所有 MMU(和缓存)操作(从内核内部),用于调试目的,只是为了运行一些测试.明确地说,我不打算在那之后我的系统仍然可以运行. 关于我的设置:我目前正在摆弄集成了 Cortex A5 的 Freescale Vybrid (VF610) 及其低功耗模式.由于我正在尝试一些可疑的本地内存损坏,而芯片处于“低功率停止"模式并且我的 DDR3 处于自我刷新
..
当我在 Cortex-A9 MPCore 中调试 MMU 时,我总是看到域访问控制寄存器,但是,域是什么意思?最多 16 个域?谁能给我一个链接来解释这个? 解决方案 TL;DR DACR 不仅减少了上下文切换代码路径,还可以在上下文切换发生后加快执行速度. 有几个链接解释了域访问控制寄存器或DACR的细节.例如ARM的内存访问权限和域.但是,此页面和许多其他页面没有解释为什么您可能
..
我有以下基于 ARM 的 SoC 规格: L1 数据缓存 = 32 KB, 64 B/line, 2-WAY, LRU L2 缓存 = 1 MB,64 B/行,16 路 L1 数据 TLB(用于加载):32 个条目,完全关联 L2 数据 TLB:512 个条目,4 路 PDE 缓存:16 个条目(每 1 MB 虚拟空间一个条目) 我想知道 PDE 缓存是什么?我想这与 TLB
..
我在我的 s3c2440 板上启用了 MMU(3G - 4G 内存 :: 故障属性),当我没有读/写 3G - 4G 内存时一切都很好.所以为了测试页面错误向量,我写信给一个 0xFF 到 3G 地址,正如我所料,我从 FSR 得到了正确的值,所以我在 _do_page_fault() 中做了这个,步骤是这样的: .....//设置新页面到翻译表.....invlidate_icache();/
..
根据 pgtable-2-level.h,ARM Linux有两个版本的PTE;Linux PTE 和 H/W PTE.Linux PTE 存储在 1024 字节以下的偏移量. 在handle_pte_fault 中处理页面错误时,pte_file、pte_mkdirty、pte_mkyoung 等各种函数,使用版本 H/W PTE. 但实际上 ARM H/W 不支持其 PTE 中的脏
..