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

Dpk*_*Dpk 3 linux linux-device-driver linux-kernel

我基本上想知道两件事

\n\n
    \n
  1. kmalloc 是如何工作的,我的意思是 kmalloc 调用哪个函数来分配内存,是 alloc_pages() 还是 __ger_free_pages()。
  2. \n
  3. 为什么 __GFP_HIGHMEM 标志不能应用于 __get_free_page() 或 kmalloc()
  4. \n
\n\n

我从 LKD Robert Love 中得到了以下摘录,任何人都可以更好地解释在给出 __GFP_HIGHMEM 标志时使用 alloc_pages() 的确切问题是什么。

\n\n

第 240 页 第 12 章

\n\n
\n

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

\n
\n

Cla*_*dio 5

正如《Linux 设备驱动程序》第三版(可在此处免费获取)一书中所解释的那样,“Linux 内核至少知道三个内存区域:支持 DMA 的内存、普通内存和高端内存”。该__GFP_HIGHMEM标志表示“分配的内存可能位于高端内存”。该标志具有与平台相关的作用,尽管其用法在所有平台上都有效。

现在,正如此处所解释的,“高端内存是计算机中物理内存的一部分,不直接由操作系统内核的页表映射”。该内存区域未映射到内核的虚拟地址空间中,这使得内核无法直接引用它。不幸的是,用于内核模式数据结构的内存必须在内核中直接映射,因此不能位于 HIGHMEM 区域中。