我的问题是这些一对一映射的优点是什么
armv7 mmu,当mmu必须做页表转换时
有TLB未命中吗?
你的答案部分包含在问题中。 1:1 映射是通过 1MB 部分实现的,因此 TLB 条目较小。即,一个 4k 页需要一个 1 级和 2 级 TLB 条目,并且它只包含 4k 内存。 ARM 内核必须始终保持映射,因为它有中断、页面错误和其他可能随时调用的关键代码。
对于用户空间代码,每个 4k 代码块都由一个inode并且在内存压力期间可能会被从内存中清除。用户空间代码通常只有几个热进程/例程,因此它们的 TLB 条目并不那么重要。 TLB 通常次于 L1/L2 缓存。
同样,设备驱动程序通常需要知道physical地址,因为它们位于 CPU 外部并且不知道虚拟地址。减法的简单性PAGE_OFFSET
有助于编写高效的代码。
一对一映射的唯一优点是 S/W 可以通过减去 PAGE_OFFSET 直接获取相应虚拟地址的物理地址,还是 ARMV7 MMU 页面转换也有其他优点?
1:1 映射允许一次性映射更大的范围。典型的 SDRAM/核心内存以 1MB 为增量。它也非常高效。还有其他可能性,但这些可能是这个选择的胜利。
唯一的好处就是一对一映射,这样S/W就可以直接
获取相应虚拟地址的物理地址
减去 PAGE_OFFSET 或者 ARMV7 MMU 上还有其他一些优势
也有页面翻译吗?
MMU必须打开才能使用数据缓存并在用户空间进程之间进行内存保护;彼此以及用户/内核分离。单独检查内核对 1:1 映射的使用并不是全部。内核的其他部分需要MMU。如果没有 MMU,1:1 映射将是身份。 IE。PAGE_OFFSET==0
。具有固定偏移量的唯一原因是允许将任何物理地址处的内存映射到公共虚拟地址。并非所有平台都有相同的PAGE_OFFSET
value.
的另一个好处是virt_to_phys
关系;内核被编写为在固定的虚拟地址上执行。这意味着内核代码不需要与 PC 相关,但可以在具有不同核心内存物理地址的平台上运行。小心在arm/boot汇编代码与 PC 相关,因为引导加载程序在 MMU 关闭的情况下进行手动控制。这arm/boot代码设置初始映射。
也可以看看:查找向量表的物理地址 https://stackoverflow.com/questions/19275718/find-the-physical-address-of-exception-vector-table-from-kernel-module,一个例外virt_to_phys
映射。
内核数据可交换吗? https://stackoverflow.com/questions/29738696/in-linux-physical-memory-pages-belong-to-the-kernel-data-segment-are-swappable
内核如何管理小于1GB的内存? https://stackoverflow.com/questions/4528568/how-does-the-linux-kernel-manage-less-than-1gb-physical-memory
有关 ARM Linux 启动的一些详细信息? https://stackoverflow.com/questions/27607496/some-details-on-arm-linux-boot
Linux内核中的页表 https://stackoverflow.com/questions/16688540/page-table-in-linux-kernel-space- 早期启动和MMU。