struct page* alloc_pages(gfp_t gfp_mask, unsigned int order)
是用于在内核中分配页面的函数。所以这将分配2 ^个连续的物理页面。所以这意味着页面将以1,2,4,8,16的方式分配,依此类推。如果只需要3页或5,9等等,该怎么办?
alloc_pages
从物理记忆中分配continuous page frames。当然,Linux内核有这个名字不好的名字。
我相信它正在使用buddy allocator。
大多数情况下,您甚至不需要连续的页面框架。这仅适用于执行DMA传输或类似操作的硬件。您不太可能需要9个连续帧。如果你真的这样做,你将分配16页并释放剩余的7页,例如order=0
。
来自the link provided by tkausl:
订单是要分配的两个页面的功率
所以alloc_pages(gfp_mask, 3)
将分配8页。 alloc_pages(gfp_mask, 4)
将分配16页,依此类推。
如果您想要精确的页数,请致电alloc_pages_exact()
。它采用所需的字节大小和GFP标志,并返回页面对齐的地址。调用与传递给free_pages_exact()
相同大小的alloc_pages_exact()
来释放内存。
#define MY_BUF_SIZE 20000 /* size in bytes */
...
mydev->buf = alloc_pages_exact(MY_BUF_SIZE, GFP_KERNEL);
...
if (mydev->buf)
free_pages_exact(mydev->buf, MY_BUF_SIZE);
请注意,alloc_pages_exact()
的实现如下:
alloc_page()
(通过__get_free_pages()
)分配确定页面顺序的单个“复合页面”,其中包含两个单页数的幂。split_page()
将复合页面拆分为单个页面。free_page()
。free_pages_exact()
的实现使用指定的大小(应该与传递给alloc_pages_exact()
的大小相匹配)来确定要释放的单个页面的数量,并从指定的虚拟地址开始释放许多连续页面(通过调用free_page()
)。