Linux kernel 在ARMv7的上下文中,当mmu必须进行页表转换时,Linux内核一对一映射内存的优势是什么

Linux kernel 在ARMv7的上下文中,当mmu必须进行页表转换时,Linux内核一对一映射内存的优势是什么,linux-kernel,arm,paging,mmu,Linux Kernel,Arm,Paging,Mmu,Linux内核虚拟地址是一对一映射的。因此,通过减去虚拟地址的页偏移量,我们将得到物理地址。这就是如何和如何在中实施 我的问题是,当出现TLB未命中时,mmu必须执行页表转换时,armv7 mmu上的这些一对一映射的优势是什么 一对一映射的唯一优点是S/W可以通过减去PAGE\u OFFSET直接获得相应虚拟地址的物理地址,还是ARMV7 MMU页面转换的其他优点 如果1:1映射内存与mmu页表转换相比没有优势,那么为什么我们需要页表作为1:1映射内存呢。我的意思是,mmu可以以类似的方式执行操

Linux内核虚拟地址是一对一映射的。因此,通过减去虚拟地址的
页偏移量
,我们将得到物理地址。这就是如何和如何在中实施

我的问题是,当出现TLB未命中时,mmu必须执行页表转换时,armv7 mmu上的这些一对一映射的优势是什么

一对一映射的唯一优点是S/W可以通过减去
PAGE\u OFFSET
直接获得相应虚拟地址的物理地址,还是ARMV7 MMU页面转换的其他优点

如果1:1映射内存与mmu页表转换相比没有优势,那么为什么我们需要页表作为1:1映射内存呢。我的意思是,mmu可以以类似的方式执行操作,即
virt\u to\u phys
,而不是遍历所有页表

我的问题是,这些一对一映射的优点是什么 armv7 mmu,当mmu必须进行页表转换时 有一个TLB未命中

你的答案部分在问题中。1:1映射使用1MB部分实现,因此TLB条目更小。也就是说,4k页面需要1级和2级TLB条目,并且它只包含4k内存。ARM内核必须始终保持映射,因为它有中断、页面错误和其他可能随时调用的关键代码

对于用户空间代码,每个4k代码块都有一个inode支持,并且在内存压力期间可能会从内存中逐出。用户空间代码通常只是几个热进程/例程,因此它们的TLB条目没有那么重要。TLB通常是L1/L2缓存的辅助缓存

此外,设备驱动程序通常需要知道物理地址,因为它们位于CPU之外,不知道虚拟地址。减法
页偏移量
的简单性有助于高效编码

一对一映射的唯一优点是S/W可以通过减去页偏移量直接获得相应虚拟地址的物理地址,还是ARMV7 MMU页转换的其他优点

1:1映射允许一次性映射更大的范围。典型的SDRAM/核心内存以1MB为增量。它也非常高效。还有其他的可能性,但这些可能是这个选择的胜利

是一对一映射的唯一优点,因此S/W可以直接 获取各个虚拟地址的物理地址 减去页偏移量,或者ARMV7 MMU上还有其他一些优势 还有网页翻译吗

MMU必须开启,以使用数据缓存并在用户空间进程之间进行内存保护;以及用户/内核分离。单独检查内核对1:1映射的使用并不是全部内容。内核的其他部分需要MMU。如果没有MMU,1:1映射将成为标识。即
页偏移量==0
。拥有固定偏移量的唯一原因是允许任何物理地址的内存映射到公共虚拟地址。并非所有平台都具有相同的
页偏移量

virt\u-to\u-phys
关系的另一个好处;内核被编写为在固定的虚拟地址执行。这意味着内核代码不需要与PC相关,但可以在具有不同物理地址的核心内存的平台上运行。在arm/boot汇编程序代码中要注意与PC相关,因为引导加载程序要在MMU关闭的情况下手动控制。此arm/boot代码设置初始映射

另请参见:,这是
virt\u-to\u-phys
映射的一个例外。




-早期启动和MMU。

如果没有固定的1:1映射,您将如何建议实现
phys\u to\u virt()
?此外,这个问题的前提似乎有点混乱——是的,当CPU只是通过VA访问内存时,MMU自己执行翻译,但这与内核需要计算VA/PA翻译时是完全不同的(例如,向设备传递DMA地址、启动辅助CPU或更新页表本身)。如果1:1映射内存和mmu页表转换之间没有关系,那么对于1:1映射内存,我们为什么需要页表(在多级页表中,我们需要多次访问内存),只需减去一个页偏移量就可以得到物理地址。因为mmu总是使用页表,它对某些偏移量一无所知。1:1映射只是为了方便起见,是吗?mmu需要页表,这就是它的工作方式。此外,对于例如vmalloc或用户空间地址,没有1:1映射,内核线性映射是特殊情况。@不是这样,您的意思是说内核线性映射范围内的地址不通过页表?