Linux 3/1虚拟地址拆分

Dav*_*vid 9 linux virtual-memory linux-kernel

在了解highmem需要超过1GB的RAM时,我遗漏了一些东西.有人能指出我哪里出错吗?谢谢!

我知道的:

  • 为内核操作保留1 GB进程的虚拟内存(高内存区域).用户空间可以使用剩余的3 GB.这是3/1分裂.

  • VM的虚拟内存功能将(连续)虚拟内存页面映射到物理页面(RAM).

我不知道的是:

  • 什么操作使用内核虚拟内存?我想像内核空间中的kmalloc(...)这样的东西会使用内核虚拟内存.

  • 我认为在这个方案下可以使用4GB的RAM.我不明白为什么内核1 GB虚拟空间是解决物理空间时的限制因素.这是我理解失败的地方.请指教.

我一直在读这篇文章(http://kerneltrap.org/node/2450),这很棒.但它并不能完全解决我的问题.

caf*_*caf 11

内核虚拟空间是可用物理内存限制因素的原因是因为内核需要访问所有物理内存,而它访问物理内存的方式是通过内核虚拟地址.内核不使用允许直接访问物理内存位置的特殊指令 - 它必须为要与之通信的任何物理范围设置页表条目.

在"旧风格"的方案,内核处理事情让每一个进程的页表映射到虚拟地址从0xC00000000xFFFFFFFF直接到物理地址来自0x000000000x3FFFFFFF(这些网页标记,以便他们只是在ring 0访问-内核模式).这些是"内核虚拟地址".在这种方案下,内核可以直接读写任何物理内存位置,而无需使用MMU来改变映射.

在HIGHMEM方案下,从内核虚拟地址到物理地址的映射不是固定的 - 物理内存的一部分被映射到内核虚拟地址空间内外,因为内核需要访问该内存.这允许使用更多的物理内存,但代价是必须不断地改变虚拟到物理映射,这是非常昂贵的操作.

  • 是的,绝对(他们仍然可以 - 他们有时必须跳过篮球才能这样做).这是必需的 - 例如,在中断发生时正在运行的任何进程的上下文中服务中断.内核有点像一个大的共享库,除了它的代码在一个提升的权限级别运行(你不能只调用它 - 你需要通过一个提高权限级别的特殊入口点). (3认同)

Mat*_*ner 5

在每个进程中将1 GB映射到内核允许进程切换到内核模式,而无需执行上下文切换。响应系统调用诸如read()mmap()和其他人可以然后在调用进程的地址空间进行适当的处理。

如果没有在每个进程中保留内核空间,则在执行用户空间代码之间切换到“内核模式”将更加昂贵,并且将无法通过硬件MMU(内存管理单元)对系统调用使用虚拟地址映射。被服务。

运行具有超过1GB物理内存的32位内核的系统能够在中分配物理内存位置ZONE_HIGHMEM(大约在1GB标记之上),这可能需要内核跳过特定的操作才能与之交互。PAE(物理地址扩展)的添加通过允许最多64GB的物理内存,降低了1GB物理地址内存中的内存与分配给的区域的比例而扩展了此问题ZONE_HIGHMEM