在64位Linux内核启动时,会把所有物理内存一次性映射到内核线性地址空间,目的是让内核可以随时、直接、高效地访问任意物理页,保证伙伴系统、slab、驱动、中断等所有内核内存操作无需动态建页表、不触发缺页、不阻塞,从而保证内核稳定、高效运行。但是如果系统配置了1T的物理内存,如果用4K的Page,则页表项将消耗大量空间,所以在内核设置映射的时候可以用HugePage,比如1G的Page,这样页表项所占空间将大大减少:虽然页表项大大减少了,但是每个struct page依然是描述的4K的Page,它们组成mem_map的巨型数组,这个数组的空间会非常大:16G,如下:
内核空间映射设置为1G的Page,那么__get_free_pages分配一个4K的空间,会有影响吗?没有,就如前面所所,因为伙伴系统内存分配基于struct page,也就是4K的Page来分配的。