Linux中存储空间按连续与否可分为连续存储空间和不连续存储空间。连续存储空间以UMA为代表,非连续存储空间以NUMA为代表。在内核中,通过条件编译选择项CONFIG_DISCONTIGMEM可以选择不同类型的存储空间。针对不同的存储空间,Linux内核有不同的alloc_pages()函数以供调用,以实现物理页面的分配。

Linux中物理页面分配的主函数为:struct page * alloc_pages(int gfp_mask, unsigned long order)

先考虑NUMA结构的存储空间。我们知道,NUMA结构的存储空间有不同的存储节点(pg_data_t),每个存储节点有多个不同类型的存储管理区(最多3个),而每个存储管理区又管理多个连续的物理页面。如果有进程要求分配页面,则依次在由存储节点构成的单链表中尝试分配2的order次幂页面个数,如果成功就返回申请成功的页面块的首个页面结构的地址。

相对于UMA结构的存储空间,其页面分配就相对简单多了。它只有一个存储节点,只需在该节点的各个存储管理区上去获取2的order次幂页面个数即可。