alloc_pages() 和 get_free_pages() 返回值的区别

Pra*_*pta 5 memory-management linux-kernel

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

Ent*_*KEY 4

alloc_pages(mask, order) 分配 2order 页并返回 struct page 的实例来表示保留块的开始。如果仅请求一页,则 alloc_page(mask) 是 order = 0 的较短表示法。

\n\n

__get_free_pages(mask, order) and __get_free_page(mask)与上述函数的工作方式相同,但返回保留内存块的虚拟地址而不是页面实例。

\n\n

kmalloc(size, mask)保留一个 size 字节的内存区域,并返回一个指向该区域开头的空指针。如果可用内存不足(在内核中这是一种非常不可能的情况,但必须始终满足这种情况),则会产生空指针。

\n\n

mask speci\xef\xac\x81es 有关请求的详细信息:

\n\n
\xe2\x80\xa2 memory zone\n\xe2\x80\xa2 behavior of allocator (blocking/unblocking request, etc.)\n\xe2\x80\xa2 e.g. GFP_KERNEL, GFP_ATOMIC, GFP_DMA, etc\n
Run Code Online (Sandbox Code Playgroud)\n\n

alloc_pages() and __get_free_pages() : allocate pages, at low level

\n\n

kmalloc() : allocate physically contiguous sequence of bytes

\n\n

欲了解更多信息,请参阅professional linux kernel architecture by wolfgang mauerer

\n

  • 我的意思是内核逻辑地址,内核逻辑地址不存在的高端内存,因为它超出了其范围。通常高端内存是没有永久映射到内核地址空间的内存,因此访问它的唯一方法可能是通过对应的struct page结构。 (2认同)