当涉及到需要highmem处理1GB以上的RAM时,我遗漏了一些东西。有人能指出我哪里出了问题吗?谢谢!
据我所知:
进程的虚拟内存(高内存区域)的
我不知道的是:
我一直在读这篇文章(http://kerneltrap.org/node/2450),这很棒。但这并不是我喜欢的问题。
发布于 2009-11-02 06:16:13
内核虚拟空间之所以成为可使用物理内存的限制因素,是因为内核需要访问所有物理内存,并且访问物理内存的方式是通过内核虚拟地址。内核不使用允许直接访问物理内存位置的特殊指令-它必须为它想要交谈的任何物理范围设置页表条目。
在“旧样式”方案中,内核设置了每个进程的页表,以便每个进程的页表直接将虚拟地址从0xC0000000映射到0xFFFFFFFF,将物理地址从0x00000000映射到0x3FFFFFFF (这些页面被标记为只能在环形0内核模式下访问)。这些是“内核虚拟地址”。在这种方案下,内核可以直接读写任何物理内存位置,而无需修改MMU来更改映射。
在HIGHMEM方案下,从内核虚拟地址到物理地址的映射不是固定的-物理内存的一部分被映射到内核虚拟地址空间中,因为内核需要访问该内存。这允许使用更多的物理内存,但代价是必须不断地更改虚拟到物理的映射,这是一个非常昂贵的操作。
发布于 2009-11-01 23:38:33
在每个进程中将1GB映射到内核允许进程切换到内核模式,而无需执行上下文切换。然后,可以在调用进程的地址空间中适当地处理对系统调用(如read()、mmap()和其他调用)的响应。
如果没有在每个进程中为内核预留空间,那么在执行用户空间代码之间切换到“内核模式”将更加昂贵,并且无法通过硬件MMU (内存管理单元)对正在服务的系统调用使用虚拟地址映射。
运行大于1GB物理内存的32位内核的系统能够在ZONE_HIGHMEM中分配物理内存位置(大致高于1GB标记),这可能要求内核跳过圈,以便某些操作与它们交互。PAE (物理地址扩展)的添加扩展了这个问题,允许最多64 1GB的物理内存,降低1GB物理地址内存中的内存与ZONE_HIGHMEM中分配的区域的比率。
发布于 2009-11-01 23:28:06
例如,
https://stackoverflow.com/questions/1658757
复制相似问题