我试图了解Linux SPARSEMEM
内存模型的工作方式。据我了解,设置SPARSEMEM_VMEMMAP
时,存在第二个映射,可将mem_map从不同的(可能是断开的)部分“粘合”起来,这样PFN
和page
结构之间的映射是连续的。到目前为止一切顺利。
问题是,如果物理内存确实有漏洞,那么从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;
这是否意味着物理地址空间仍然需要连续并且不允许出现空洞?还是我想念这里的东西?谢谢!
答案 0 :(得分:0)
SPARSEMEM
的工作原理here有一个很好的总结。
Sparsemem使用数组提供不同的pfn_to_page() 物理内存的每个SECTION_SIZE区域的转换。这是 是什么让mem_map []被切碎。