linux - TLB 中的内核内存(虚拟地址条目)?

标签 linux memory-management hardware kernel tlb

Linux 是操作系统,ARM 是本文中提到的处理器。

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

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

内核内存(虚拟)直接对应于物理内存(只需偏移 0xC000_0000 即可获得物理地址)。是否有必要在 TLB 中拥有内核内存(虚拟)(如果你说它存在于 TLB 中)?它应该只有用户空间地址。

最佳答案

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

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

页表使这一切成为可能。

您确实希望能够在内核的虚拟地址空间中映射和取消映射物理内存,通常这种翻译机制适用于整个系统。当然,转换是有代价的,因为您现在需要查询和维护页表,这会影响性能。但一切并没有丢失:

  1. TLB 在一定程度上缓解了这个问题。他们缓存翻译。
  2. 更大的页面(例如 ARMv7-Alarge pagessections)帮助更大,因为它们需要更少的 TLB 条目翻译后的内存。
  3. 还有全局页面之类的东西。当您在应用程序之间切换并需要刷新当前 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/

相关文章:

python - pyftpdlib make os.makedirs 权限被拒绝

c++ - Lambda 捕获和内存管理

hardware - block 和扇区之间的区别

linux - DTS : Overwriting pin configuration

linux - 如何使用 linux 从一台计算机访问另一台计算机上的命令提示符

c - 在c中使用execvp执行touch

c - argv 打印出环境变量

memory-management - CS简介-存储程序概念-无法理解概念

objective-c - 使用 NSOperation 处理目标/ Action 弱引用

linux - 如何在 Raspberry Pi 上有效监控以太网何时插入/拔出?