使用alloc_pages分配页面是否也分配了结构?

时间:2014-07-18 13:35:31

标签: c linux-kernel

让我们考虑一下这段代码:

struct page * str_page = alloc_pages(some flags, 4);
str_page++;

在第一行中,将分配16个页面,并将指向第一个已分配页面的struct page的指针保存到str_page
然后我递增这个指针,它现在指向这个结构后面 它现在指向第二个分配页面的struct page吗?

一般问题是:
所有已分配页面的结构是否也分配了alloc_pages(),或者这些结构实际上是由内核先前分配并由它处理的?

2 个答案:

答案 0 :(得分:1)

  
    

它现在指向第二个分配页面的struct页面吗?

  

通常是它。主要是因为alloc_pages分配了连续的页面(vs稀疏/分散),只有这样才能实现它。

但是,我建议你不要这样做。如果你想获得特定物理页面的struct页面,你应该使用pfn_to_page / phys_to_page(显然是page_to_phys / page_to_pfn用于反向操作)。我不认为可以保证结构页面如何在内存中布局。

  
    

所有已分配页面的结构是否也使用alloc_pages()分配,或者这些结构实际上是由内核先前分配并由它处理的?

  

它们只是对预先分配的页面的引用。实际的页面是由内核在引导时分配的,并且从那时起由内核管理。

答案 1 :(得分:0)

以下似乎表明页面是连续的:

http://www.makelinux.net/books/lkd2/ch11lev1sec3

这意味着递增str_page指针会使值增加str_page的大小,从而为您提供内存中的下一页。

在c中,它是如何工作的。将指针递增到类型时,可以将指针的地址增加该类型的大小