几乎所有关于Linux内核中HIGHMEM的书籍和文章,他们都说在使用3:1分割时,并不是所有的1GB都可用于内核映射。通常它的大小为896MB左右,其余部分用于内核数据结构,内存映射,页表等。什么数据结构使用128MB的1GB Linux内核空间?
我的问题是,这些数据结构究竟是什么?页表通常通过页表地址寄存器访问,对吧?并且页表的基地址通常被存储为物理地址。现在为什么需要为整个表保留一个虚拟地址空间?
同样,我读了关于占用空间的内核代码本身。这与虚拟地址空间有什么关系?这不是用于存储代码的物理内存吗?
最后,这些数据结构,为什么他们要保留128MB的空间?为什么不能按照需要在整个1GB地址空间中使用它们,就像内核中的任何其他正常数据结构一样?
我已经通过LDD3专业Linux内核架构和几个帖子在这里堆栈溢出(如:Why Linux Kernel ZONE_NORMAL is limited to 896 MB?)和一个较旧的LWN article,但没有找到相同的具体信息。
如果没有为特定数据结构保留128MB,为什么我们不能使用整个1G内核虚拟空间映射到某个虚拟地址?这样,如果一个系统有1GB的物理内存,则根本不需要使用HIGHMEM。在基于896MB的设置中,需要HIGHMEM来利用大于896MB的任何物理内存。同样,当我们为某些东西(甚至不使用它)保留128MB时,虚拟地址范围变得不可用于'vmalloc'。正如你所说的,一切都是通过虚拟地址访问的。他们为什么浪费任何虚拟地址? – codetwiddler 2012-07-19 14:33:06
@codetwiddler,这是相当复杂的......浪费虚拟地址是不好的,但它并非没有用处。基本点是有两种方法可以将虚拟地址连接到物理地址 - 直接映射(lowmem)和任意动态映射(vmalloc)。每个人都必须使用一个单独的虚拟地址范围,所以他们不会发生冲突。 – ugoren 2012-07-19 14:37:04
同意一切,我知道有两种方法及其用途。现在,具体来说,如果我有1GB的物理内存,我需要使用HIGHMEM来访问超过896MB,因为这个1GB-896MB块被保留。那是什么目的,它是多么复杂?该保留应该有一些结构或与该空间相关的东西,或者至少是指向某个地方的指针,如果该保留是静态的,我认为它应该是相当重要的实体。 – codetwiddler 2012-07-19 16:40:35