在了解需要highmem来解决超过1GB RAM的问题时,我缺少一些东西。有人可以指出我哪里出问题了吗?谢谢!
我知道的:
保留1 GB的进程虚拟内存(高内存区域)用于内核操作。用户空间可以使用剩余的3 GB。这是3/1分割。
VM的虚拟内存功能将(连续)虚拟内存页面映射到物理页面(RAM)。
我不知道的是:
哪些操作使用内核虚拟内存?我想内核空间中的kmalloc(…)之类的东西会使用内核虚拟内存。
我认为在此方案下可以使用4GB的RAM。我不明白为什么内核1 GB虚拟空间是解决物理空间时的限制因素。这是我的理解破裂的地方。请指教。
我一直在阅读这篇文章(http://kerneltrap.org/node/2450),这很棒。但这并不能完全按照我的喜好解决我的问题。
内核虚拟空间是可用物理内存的限制因素的原因是,内核需要访问所有物理内存,而访问物理内存的方式是通过内核虚拟地址。内核不使用允许直接访问物理内存位置的特殊指令- 它必须为它要与之交谈的任何物理范围设置页表条目。
在“旧样式”方案中,内核进行了设置,以便每个进程的页表将虚拟地址从映射0xC0000000到0xFFFFFFFF直接映射到物理地址从映射0x00000000到0x3FFFFFFF(这些页已标记为只能在环0-内核模式下访问)。这些是“内核虚拟地址”。在这种方案下,内核可以直接读取和写入任何物理内存位置,而无需费心MMU来更改映射。
0xC0000000
0xFFFFFFFF
0x00000000
0x3FFFFFFF
在HIGHMEM方案下,从内核虚拟地址到物理地址的映射不是固定的- 物理内存的某些部分在内核需要访问该内存的情况下映射到内核虚拟地址空间中或从内核虚拟地址空间中映射出来。这允许使用更多的物理内存,但是以必须不断更改虚拟到物理的映射为代价,这是相当昂贵的操作。