本章开始说内存,内存的管理是极其复杂的模块,涉及到非常多概念,光地址就有逻辑,线性,物理地址三个,网上文章很多,参差不齐,没有很好基础或实战经验的同学基本得懵掉,本篇最后也有这些概念介绍。系列篇打算用三篇来讲述鸿蒙内核的内存管理机制。由浅入深,层层递进。我们换个视角切入,将从进程和线程创建的视角看内存的运作机制。为何从进程和线程角度?
两个原因:1.内存就是给他们使用的,只是分了内核空间和用户空间。用户空间的进程分配用到了虚拟内存,线程(task)需要分配栈空间 2.系列文章对进程和线程的管理和调度已经说完了,但是没有说内存,还有IPC(也是复杂的模块),有了前面的基础我们再来说鸿蒙的内存管理会轻松些。
进程内存描述符LosVmSpace
typedef struct ProcessCB { //..只留下相关部分 LosVmSpace *vmSpace; /**< VMM space for processes */ }LosProcessCB; typedef struct VmSpace { LOS_DL_LIST node; /**< vm space dl list */ LOS_DL_LIST regions; /**< region dl list */ LosRbTree regionRbTree; /**< region red-black tree root */ LosMux regionMux; /**< region list mutex lock */ VADDR_T base; /**< vm space base addr */ UINT32 size; /**< vm space size */ VADDR_T heapBase; /**< vm space heap base address */ VADDR_T heapNow; /**< vm space heap base now */ LosVmMapRegion *heap; /**< heap region */ VADDR_T mapBase; /**< vm space mapping area base */ UINT32 mapSize; /**< vm space mapping area size */ LosArchMmu archMmu; /**< vm mapping physical memory */ #ifdef LOSCFG_DRIVERS_TZDRIVER VADDR_T codeStart; /**< user process code area start */ VADDR_T codeEnd; /**< user process code area end */ #endif } LosVmSpace;
被进程使用的内存叫进程内存描述符LosVmSpace(也叫虚拟内存空间),虚拟内存空间有多个虚拟存储区域(region),Linux内核中对这些虚拟存储区域的组织方式有两种,一种是采用双循环链表(regions),还有一