让我们考虑一下这段代码:
struct page * str_page = alloc_pages(some flags, 4);
str_page++;
在第一行中,将分配16个页面,并将指向第一个已分配页面的struct page
的指针保存到str_page
。
然后我递增这个指针,它现在指向这个结构后面
它现在指向第二个分配页面的struct page
吗?
一般问题是:
所有已分配页面的结构是否也分配了alloc_pages()
,或者这些结构实际上是由内核先前分配并由它处理的?
答案 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中,它是如何工作的。将指针递增到类型时,可以将指针的地址增加该类型的大小