2015-02-11 126 views
2

超过896MB的线性地址对应于高内存区域ZONE_HIGHMEM。 因此,页面分配器功能在这个区域不起作用,因为它们给出ZONE_NORMAL和ZONE_DMA中直接映射的页面帧的线性地址。内核虚拟地址空间中的高内存映射

我感到困惑的Undertanding Linux内核指定的这几行:

  1. 做什么时,他们说,他们的意思是“在64位硬件平台ZONE​​_HIGHMEM始终是空的。”

  2. 这是什么突出的语句意味着:“高内存页帧的分配是通过alloc_pages只是做()函数,因为它们不存在这些函数不返回线性地址取而代之的是函数返回线性地址这些线性地址总是存在的,因为在内核初始化期间,所有的页面描述符在低内存中一次性分配一次。“

什么是这些页面描述符,896MB是否已经拥有整个RAM的所有页面描述符。

回答

1
  1. 的X86-32内核需要高存储器访问除物理内存1G多,因为不可能永久大于2^{32}的地址的32位地址空间,并在内核中映射/用户分割为1G/3G。 x86-64内核没有这样的限制,因为可物理寻址的内存(当前为256T)的数量适合其64位地址空间,因此可以永久映射。 高内存是一个黑客。理想情况下,你不需要它。的确,x86-64的重点是能够直接处理所有你可能想要的内存。拍摄 from https://www.quora.com/Linux-Kernel/What-is-the-difference-between-high-memory-and-normal-memory

  2. 我认为页面描述符的意思是struct page。并考虑到尺寸struct page。是的,他们都可以存储在ZONE_NORMAL中

+0

了解第一个问题。关于第二,是使用alloc_pages()分配的高内存,我读了alloc_pages会返回NULL为高内存,因为没有映射存在。他的意思是:“这些线性地址总是存在的,因为在内核初始化期间,所有的页面描述符都会在内存中分配一次,直到永远。” – Haswell 2015-02-11 06:27:21

+1

AFAIK,高内存只能由alloc_pages分配,因为__get_free_pages和kmalloc返回的是逻辑地址而不是结构页。但即使使用alloc_page,它的分配并不严格,当你将__GFP_HIGHMEM分配给alloc_page时,分配器的第一个首选项是ZONE_NORMAL。而且大部分的分配都会在ZONE_NORMAL中结束。 – 2015-02-11 08:20:23

+0

@MilindDumbare,在32位或64位情况下,“lowmem”地址0的基址的VA是什么?从你的评论看来,似乎暗示给定物理内存的基本VA,我们只需访问'base_VA + desired_RAM_location'即可访问RAM中的任何字节。很明显,我们可以在64位的情况下访问所有的物理内存,但是这个问题对于32位的情况仍然有效(即我们可以访问所有的“lowmem”)。 – sherrellbc 2017-06-23 17:09:08

相关问题