虚拟地址空间布局[mem_map/memmap]

VMEMMAP_SIZE

 内核使用page结构体描述一个物理页,内存的所有物理页对应一个page结构体数组。如果内存的物理地址空间不连续,存在很多空洞,称为稀疏内存。vmemmap区域是稀疏内存的page结构体数组的虚拟地址空间。

 根据注释:这个区域的大小可以存放所有的 struct page 对象数组,这个数组可以覆盖 整个 线性映射区域。 
#define VMEMMAP_SIZE \

(UL(1) << (VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT))

(内核虚拟空间大小/4096/2=内核线性映射地址空间的page数量(P),对应page 结构体占用的总虚拟内存=P*BITS(STRUCT_PAGE_MAX_SHIFT)=2^6*P.)


举例:sizeof struct page 为44个字节。 2^5 = 32 < 44 ;   2^6 = 64 > 44; 则 STRUCT_PAGE_MAX_SHIFT 为 6 。 shift 是移位, max 是最大。这么大的空间中,肯定可以存放的下一个 struct page 对象。

2 modules

如果定义了CONFIG_MODULES功能,则需要在用户空间开辟一段空间给insmod插入的模块。

这部分空间是动态映射的,在定义CONFIG_HIGHMEM情况下为16MB-2MB=14MB,从0xbf00000 - 0xbfe00000。

在 AARCH64 里是128M

 

猜你喜欢

转载自blog.csdn.net/y13182588139/article/details/125817492