2011-12-12 72 views
7

Linux是操作系统,ARM是本文中提到的处理器。TLB中的内核内存(虚拟地址条目)?

TLB是否包含内核和用户空间虚拟地址? 内核内存从0xc000_0000开始,前往0xFFFF_FFFF 其中前3 GB属于用户空间。在进程之间的上下文切换之间,TLB被刷新。

TLB是否包含内核和用户空间虚拟地址?

内核内存(虚拟)直接对应物理内存(正好用0xC000_0000抵消会给我们物理地址)。是否有必要在TLB中拥有内核内存(虚拟)(如果你说它存在于TLB中)?它应该只有用户空间地址。

回答

7

为什么我们有虚拟到现代CPU物理地址的转换的主要原因是为了更有效和更好地控制使用的内存,可以让我们:

  1. 分配任何物理内存,RAM,(连续或不),并使其可以在虚拟地址空间的任何地方(连续或不连续)进行访问,而不会浪费内存到碎片。
  2. 用磁盘或其他内存扩展物理内存RAM。
  3. 使地址空间的某些部分仅为可读或不可执行或仅内核等,并保护它们免受未授权或错误的访问。
  4. 隔离应用程序彼此的记忆以进一步改善保护,安全性和可靠性。
  5. 共享内存。 ...

而页表使这一切成为可能。

您确实希望能够在内核的虚拟地址空间中映射和取消映射物理内存,通常这种翻译机制在整个系统中都能正常工作。当然,翻译的代价是你现在需要咨询和维护页面表,并且会导致性能下降。但全部不丢失:

  1. TLBs在一定程度上缓解了这个问题。他们缓存翻译。
  2. 更大的页面(例如ARMv7-Alarge pagessections)可以提供更多帮助,因为它们需要更少的TLB条目,每单位翻译的内存。
  3. 也有像global pages的东西。当您在应用程序之间切换并需要刷新当前的TLB时,可以通过执行Invalidate TLB entries by ASID match与应用程序的ASID来避免使TLB中的全局页面失效。如果您将内核的页面标记为全局,则不会使其翻译无效,并且内核本身不会遭受不必要的TLB失效。

见,例如, “ARM®架构参考手册ARM®v7-A和ARM®v7-R版” 为相关的ARM Virtual Memory System Architecture(VMSA),页表,TLB等具体细节

5

有两种类型的虚拟地址的Linux内核使用:

  1. 你已经在该行的“内核内存(虚拟)直接 对应的物理内存提到什么(只是0xC000_0000将 给予补偿我们的实际地址)“。这映射到连续的物理地址。
  2. 使用vmalloc。

第一种是使用宏完成:

include/asm-x86/page_32.h 

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) 
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 

_pa(x)的确实的虚拟到物理转换。请注意,这个翻译是在编译时内联的。没有页面表翻译发生。这最后一句话非常重要。

另一方面,使用第二种方法,您可以分配虚拟内存中连续的内存,但物理内存中可能不会这样。现在,在这种情况下,当您第一次访问虚拟地址时,需要整页表格转换。问题是这是谁?

在CISC机器(如x86)的情况下,MMU(硬件)在TLB未命中(首次访问虚拟地址)的情况下执行该操作并更新页表。对于内核虚拟地址(通过vmalloc获取),它们保留为TLB条目。它们被称为全局条目,当进程上下文切换发生时,它们大多被忽略,而不像其他进程地址空间条目那样被刷新。但是,当您执行vfree以释放关联的虚拟内存时,这些条目将被删除。

在RISC机器(如MIPS)的情况下,页面转换由软件处理。 TLB未命中后,硬件引发异常。陷阱句柄以内核模式运行以执行翻译并使用特殊指令更新TLB。从陷阱处理程序返回后,运行相同的代码行并发生TLB命中。

请参考:http://pages.cs.wisc.edu/~remzi/OSFEP/vm-tlbs.pdf

的底线是,并非所有的内核地址映射您所描述的方式。对于你的情况,物理地址是在编译时本身生成的。那么,为什么要添加一个TLB条目。对于来自vmalloc的地址,存在TLB条目。当进程之间发生上下文切换时,不需要刷新整个TLB,并且可以保留内核的vmalloc创建的全局条目。当你使用vfree时,相应的全局条目将被刷新。

+0

ARM是一款RISC机器,我想它的工作方式与MIPS描述的相同。但我不确定。不过,我相信您的问题可以在不考虑处理器架构的情况下得到充分回答。 – trans1st0r

+0

看起来像[ARM does硬件页面漫游](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/I1029222.html)。除了TLB未命中开销较低的显而易见的优势之外,这允许推测TLB预取,这对于软件TLB未命中处理来说并不可行。另外http://stackoverflow.com/questions/28019266/arm-mmu-and-arm-linux-page-table-walk。我发现的ARM文档提到了关于禁用页面漫游位的一些内容,所以也许ARM可以使用软件页面漫游,而不像x86。 –