Linux 内核虚拟地址空间中的高内存映射
896MB以上的线性地址对应于高内存区域ZONE_HIGHMEM。 因此,页面分配器函数将不会在该区域上工作,因为它们在ZONE_NORMAL和ZONE_DMA中提供直接映射页面帧的线性地址 我对Understanding 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()完成?”函数。这些函数不返回线性地址,因为它们不存在。相反,这些函数返回第一个分配
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”)。