Linux 内核虚拟地址空间中的高内存映射

Linux 内核虚拟地址空间中的高内存映射,linux,memory-management,linux-kernel,virtual-memory,Linux,Memory Management,Linux Kernel,Virtual Memory,896MB以上的线性地址对应于高内存区域ZONE_HIGHMEM。 因此,页面分配器函数将不会在该区域上工作,因为它们在ZONE_NORMAL和ZONE_DMA中提供直接映射页面帧的线性地址 我对Understanding linux内核中指定的这些行感到困惑: 他们说“在64位硬件平台中,ZONE_HIGHMEM总是空的”是什么意思 这个突出显示的语句是什么意思:“高内存页帧的分配仅通过alloc_pages()完成?”函数。这些函数不返回线性地址,因为它们不存在。相反,这些函数返回第一个分配

896MB以上的线性地址对应于高内存区域ZONE_HIGHMEM。 因此,页面分配器函数将不会在该区域上工作,因为它们在ZONE_NORMAL和ZONE_DMA中提供直接映射页面帧的线性地址

我对Understanding linux内核中指定的这些行感到困惑:

  • 他们说“在64位硬件平台中,ZONE_HIGHMEM总是空的”是什么意思

  • 这个突出显示的语句是什么意思:“高内存页帧的分配仅通过alloc_pages()完成?”函数。这些函数不返回线性地址,因为它们不存在。相反,这些函数返回第一个分配的页帧的页描述符的线性地址。这些线性地址总是存在的,因为在内核初始化期间,所有页描述符都会在低内存中分配一次并永远分配。

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

  • x86-32内核需要高内存才能访问超过1G的物理内存,因为不可能在32位地址空间中永久映射超过2^{32}个地址,内核/用户划分为1G/3G。 x86-64内核没有这样的限制,因为物理可寻址内存(当前为256T)的数量适合其64位地址空间,因此可能总是永久映射。 高内存是一个难题。理想情况下,你不需要它。事实上,x86-64的要点是能够直接寻址您可能需要的所有内存。拿 从

  • 我认为页面描述符的意思是
    structpage
    。考虑到
    结构页面的大小
    。是的,所有这些都可以存储在正常区域


  • 理解第一个问题。关于第二点,是否使用alloc_pages()分配了高内存,我了解到alloc_pages会为高内存返回NULL,因为不存在映射。他所说的“这些线性地址总是存在的,因为在内核初始化过程中,所有的页描述符都在低内存中分配了一次又一次。”好吧,高内存只能由alloc_页分配,因为u get_free_页和kmalloc返回逻辑地址,而不是结构页。但即使是alloc_页面,它也不是严格的分配,当你说“GFP_HIGHMEM to alloc_页面”时,分配器的第一个首选项是区域正常。大多数分配都在正常区域结束。@MilindDumbare,在32位或64位情况下,“lowmem”地址0的基的VA是多少?从您的评论来看,这似乎意味着,给定物理内存的基本VA,我们可以通过访问
    base\u VA+所需的\u RAM\u位置
    来访问RAM中的任何字节。显然,我们可以在64位的情况下访问所有的物理RAM,但这个问题对于32位的情况仍然有效(即,我们可以访问所有的“lowmem”)。