memory-management - alloc_pages() 和 get_free_pages() 返回值的区别

标签 memory-management linux-kernel

为什么我们要求 alloc_pages() 与其他内存分配器函数(get_free_pages()、kmalloc())不同,返回指向结构页面的指针?
请提供一个用例。
是否与 HIGHMEM Zone 分配有关?

最佳答案

alloc_pages(mask, order)分配 2order pages 并返回一个 struct page 的实例来表示保留 block 的开始。如果只请求一页,alloc_page(mask) 是 order = 0 的较短表示法。
__get_free_pages(mask, order) and __get_free_page(mask)工作方式与
上面的函数,但返回保留内存块的虚拟地址而不是页面实例。
kmalloc(size, mask)保留一个大小字节的内存区域,并返回一个指向该区域开头的空指针。如果可用内存不足(在内核中这是一种非常不可能的情况,但必须始终满足这种情况),则结果为空指针。

掩码指定有关请求的详细信息:

• memory zone
• behavior of allocator (blocking/unblocking request, etc.)
• e.g. GFP_KERNEL, GFP_ATOMIC, GFP_DMA, etc
alloc_pages() and __get_free_pages() : allocate pages, at low levelkmalloc() : allocate physically contiguous sequence of bytes
欲了解更多信息,请参阅 professional linux kernel architecture by wolfgang mauerer

关于memory-management - alloc_pages() 和 get_free_pages() 返回值的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327250/

相关文章:

c++ - 为什么删除的内存无法使用? C++

ios - Objective-C 中的发布问题

c++ - 可遍历内存池的数据结构

linux - 中断处理和用户空间通知

c - Malloc-动态内存分配

c - prlimit64() 函数

linux-kernel - dma_map_single() : minimum requirements to struct device

c - Linux 内核 : System call hooking example

linux-kernel - 我可以在不创建平台设备的情况下查询设备树项吗?

c++ - 创建的 “new”实例的所有成员变量是否都存在于堆中而不是堆栈中?