gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:04:04 24 4
gpt4 key购买 nike

我基本上想知道这两件事

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

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

第 240 页第 12 章

You cannot specify __GFP_HIGHMEM to either __get_free_pages() or kmalloc(). Because these both return a logical address, and not a page structure, it is possible that these functions would allocate memory not currently mapped in the kernel’s virtual address space and, thus, does not have a logical address. Only alloc_pages() can allocate high memory.The majority of your allocations, however, will not specify a zone modifier because ZONE_NORMAL is sufficient.

最佳答案

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

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

关于linux - 为什么 __GFP_HIGHMEM 标志不能应用于 __get_free_page() 或 kmalloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30996276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com