Linux SPARSEMEM内存模型真的很稀疏吗?

时间:2019-09-25 19:38:15

标签: c linux memory memory-management linux-kernel

我试图了解Linux SPARSEMEM内存模型的工作方式。据我了解,设置SPARSEMEM_VMEMMAP时,存在第二个映射,可将mem_map从不同的(可能是断开的)部分“粘合”起来,这样PFNpage结构之间的映射是连续的。到目前为止一切顺利。

问题是,如果物理内存确实有漏洞,那么从PFN/page到物理地址的映射应该需要一些自定义的映射,而不是简单的线性代数,对吗?

但是在下面的代码(内核5.3)中,数学似乎很简单:

/include/asm-generic/memory_model.h
#define __phys_to_pfn(paddr)    PHYS_PFN(paddr)
/include/linux/pfn.h
#define PFN_PHYS(x) ((phys_addr_t)(x) << PAGE_SHIFT)
/include/linux/types.h
typedef u64 phys_addr_t;

这是否意味着物理地址空间仍然需要连续并且不允许出现空洞?还是我想念这里的东西?谢谢!

1 个答案:

答案 0 :(得分:0)

SPARSEMEM的工作原理here有一个很好的总结。

  

Sparsemem使用数组提供不同的pfn_to_page()   物理内存的每个SECTION_SIZE区域的转换。这是   是什么让mem_map []被切碎。