系统相关
首页 > 系统相关> > linux-为什么不能将__GFP_HIGHMEM标志应用于__get_free_page()或kmalloc()

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

作者:互联网

我想基本了解两件事

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

我从LKD的下面摘录中,罗伯特·洛夫(Robert Love)可以给任何人更好地解释在给__GFP_HIGHMEM标志的同时,alloc_pages()的确切含义是什么.

第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设备驱动程序第三版》(免费提供的here)中所述,“ Linux内核至少知道三个内存区域:具有DMA功能的内存,普通内存和高内存”. __GFP_HIGHMEM标志指示“分配的内存可能位于高内存中”.尽管此标志的使用在所有平台上均有效,但它具有与平台有关的角色.

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

标签:linux-kernel,linux-device-driver,linux
来源: https://codeday.me/bug/20191028/1950430.html