我试图了解Linux SPARSEMEM
内存模型如何工作。据我了解,当设置SPARSEMEM_VMEMMAP
时,存在第二个映射,将不同的(可能是断开连接的)部分的mem_maps粘合在一起,从而使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;
这是否意味着物理地址空间仍然需要连续并且不允许出现空洞?还是我想念这里的东西?谢谢!