函数struct page * alloc_pages()中的unsigned int顺序是什么

问题描述 投票:0回答:3

struct page* alloc_pages(gfp_t gfp_mask, unsigned int order)是用于在内核中分配页面的函数。所以这将分配2 ^个连续的物理页面。所以这意味着页面将以1,2,4,8,16的方式分配,依此类推。如果只需要3页或5,9等等,该怎么办?

c memory-management linux-kernel
3个回答
0
投票

alloc_pages从物理记忆中分配continuous page frames。当然,Linux内核有这个名字不好的名字。

我相信它正在使用buddy allocator

大多数情况下,您甚至不需要连续的页面框架。这仅适用于执行DMA传输或类似操作的硬件。您不太可能需要9个连续帧。如果你真的这样做,你将分配16页并释放剩余的7页,例如order=0


1
投票

来自the link provided by tkausl

订单是要分配的两个页面的功率

所以alloc_pages(gfp_mask, 3)将分配8页。 alloc_pages(gfp_mask, 4)将分配16页,依此类推。


0
投票

如果您想要精确的页数,请致电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()的实现如下:

  1. 使用指定的大小(以字节为单位)来确定分配的两个“页面顺序”的功效。
  2. 调用alloc_page()(通过__get_free_pages())分配确定页面顺序的单个“复合页面”,其中包含两个单页数的幂。
  3. 调用split_page()将复合页面拆分为单个页面。
  4. 在分配结束时,在任何不需要的页面上调用free_page()

free_pages_exact()的实现使用指定的大小(应该与传递给alloc_pages_exact()的大小相匹配)来确定要释放的单个页面的数量,并从指定的虚拟地址开始释放许多连续页面(通过调用free_page())。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.