为什么__GFP_HIGHMEM标志不能应用于__get_free_page()或kmalloc()

时间:2015-06-23 07:20:11

标签: linux linux-kernel linux-device-driver

我基本上想知道两件事

  1. kmalloc如何工作我的意思是kmalloc调用分配内存的函数是alloc_pages()或__ger_free_pages()。
  2. 为什么__GFP_HIGHMEM标志无法应用于__get_free_page()或kmalloc()
  3. 我从LKD获得了以下摘录Robert Love可以使用alloc_pages()在给出__GFP_HIGHMEM标志的同时更好地解释什么是确切的问题。

    Page#240第12章

      

    您无法将__GFP_HIGHMEM指定为__get_free_pages()或   kmalloc的()。因为这两者都返回逻辑地址,而不是页面   结构,这些函数可能会分配内存   当前未映射到内核的虚拟地址空间中,因此,   没有逻辑地址。只有alloc_pages()可以分配高   但是,大部分分配都不会指定   区域修饰符,因为ZONE_NORMAL就足够了。

1 个答案:

答案 0 :(得分:4)

正如Linux设备驱动程序第3版(免费提供here)中所述,&#34; Linux内核至少知道三个内存区域:支持DMA的内存,正常内存,和高记忆&#34; __GFP_HIGHMEM标志表示&#34;分配的内存可能位于高内存中<#34; 。此标志具有与平台相关的角色,但其用法在所有平台上均有效。

现在,正如here解释的那样,&#34;高内存是计算机中物理内存的一部分,它不是由其操作系统内核的页表直接映射的,而是#34; 。该内存区域未映射到内核的虚拟地址空间中,这阻止了内核能够直接引用它。遗憾的是,用于内核模式数据结构的内存必须在内核中直接映射,因此不能在HIGHMEM区域中。