Linux 是操作系统,ARM 是本文中提到的处理器。
TLB 是否包含内核和用户空间虚拟地址?
内核内存从 0xc000_0000
开始到 0xFFFF_FFFF
其中前 3 GB 属于用户空间。在进程之间的上下文切换之间,TLB 被刷新。
TLB 是否同时包含内核和用户空间虚拟地址?
内核内存(虚拟)直接对应于物理内存(只需偏移 0xC000_0000
即可获得物理地址)。是否有必要在 TLB 中拥有内核内存(虚拟)(如果你说它存在于 TLB 中)?它应该只有用户空间地址。
最佳答案
我们在现代 CPU 中进行虚拟地址到物理地址转换的主要原因是为了更有效和更好地控制内存的使用,让我们:
- 分配任何物理内存、RAM(连续或不连续)并使其可在虚拟地址空间中的任何位置访问(连续或不连续),而不会因碎片而浪费内存。
- 使用磁盘或其他内存扩展物理内存、RAM。
- 使地址空间的某些部分只可读或不可执行或仅内核等,并保护它们免受未经授权或错误的访问。
- 将应用程序的内存彼此隔离,以进一步提高保护、安全性和可靠性。
- 共享内存。 ...
页表使这一切成为可能。
您确实希望能够在内核的虚拟地址空间中映射和取消映射物理内存,通常这种翻译机制适用于整个系统。当然,转换是有代价的,因为您现在需要查询和维护页表,这会影响性能。但一切并没有丢失:
- TLB 在一定程度上缓解了这个问题。他们缓存翻译。
- 更大的页面(例如
ARMv7-A
的large pages
和sections
)帮助更大,因为它们需要更少的 TLB 条目翻译后的内存。 - 还有
全局页面
之类的东西。当您在应用程序之间切换并需要刷新当前 TLB 时,您可以通过使用应用程序的ASID
执行Invalidate TLB entries by ASID match
来避免使 TLB 中的全局页面无效。如果您将内核的页面标记为全局页面,则不会使它们的翻译无效,并且内核本身也不会遭受不必要的 TLB 无效。
例如,请参阅“ARM® 架构引用手册 ARM®v7-A 和 ARM®v7-R 版”,了解与 ARM 虚拟内存系统架构
(VMSA) 相关的特定详细信息,页面表、TLB 等
关于linux - TLB 中的内核内存(虚拟地址条目)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471240/