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

时间:2019-04-03 03:53:47

标签: c memory-management linux-kernel

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

3 个答案:

答案 0 :(得分:1)

来自the link provided by tkausl

  

顺序是两个页面分配的力量

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

答案 1 :(得分:0)

alloc_pages从物理内存分配continuous page frames。 Linux内核当然有这个名字。

我认为它正在使用buddy allocator

大多数时候您甚至不需要连续页面框架。只有执行DMA传输或类似操作的硬件才最需要此功能。您极不可能需要9个连续帧。如果确实这样做,您将分配16页并释放剩余的7页,例如order=0

答案 2 :(得分: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()的大小相匹配)来确定要释放的单个页面的数量,并释放许多连续页面(通过调用{{ 1}})从指定的虚拟地址开始。