开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
-
内核模块区域 从名称上看,该区域就同内核模块相关,确实如此,这部分区域是可以加载到内核中的模块使用,因此叫做内核模块区域,该区域的范围是由MODULES_VADDR和MODULES_END来进行标识的
-
vmalloc区域 从这个名字,大家可能会想到函数vmalloc,没错,vmalloc区域就是该函数使用的虚拟地址空间,在此额外多说一句,函数vmalloc用来分配虚拟地址连续但物理地址不连续的内存,要想物理地址也连续,需要使用kmalloc 同内核模块驱动相同,该区域也有标识:VMALLOC_START和VMALLOC_END
-
固定映射区(fixed mappings) 该区域的范围是(FIXADDR_START ~ FIXADDR_TOP) 编译时的特殊虚拟地址,为什么要在编译时指定?大家试想一下,内存管理不可能一上电就有的,这个内存管理是要进行部署的,那再部署完成前,还是有一些工作要做的,这个区域在这个阶段就起到了大作用。
-
PCI I/O space 从名字我们就可以看出,该区域是PCI设备的I/O区域,且该区域的范围是(PCI_IO_START ~ PCI_IO_END)
-
vmemmap 了解一点内存的,应该都知道有一个结构体 struct page,且所有的物理页面都会有一个struct page与之相对应。但由于无法保证时时刻刻内存的物理地址一直是连续的,且内存在动态的申请,释放,其申请和释放的大小也会多会少,这种情况下就会导致了内存空洞,这些空洞也有对应的结构体struct page,这些struct page也需要进行管理,而区域vmemmap正是这类struct page的虚拟地址空间区域
该区域的范围(VMEMMAP_START ~ PAGE_OFFSET)
- 线性映射区域 因为该区域的虚拟地址和物理地址是线性的关系,因此称作线性区
内核空间布局就介绍完了,说的比较简单,没有深入从本质上说明,后面有时间我在一一说明吧