提交 6282036a 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

梳理内存模块的注解

搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
上级 b1f4e51b
......@@ -64,8 +64,8 @@
2. [新建 Issue](https://gitee.com/weharmony/kernel_liteos_a_note/issues)
- ### **联系方式**
kuangyufei@126.com,有事请邮件/私信笔者, 抱歉因加注占用了全部空闲时间,所以无法微信回复.
kuangyufei@126.com,欢迎邮件/私信笔者, 抱歉因加注占用了全部空闲时间,所以无法微信回复.
---
系列篇文章 进入 >\> [鸿蒙系统源码分析(总目录) 【 CSDN](https://blog.csdn.net/kuangyufei/article/details/108727970) | [OSCHINA](https://my.oschina.net/u/3751245/blog/4626852) [| WIKI 】](https://gitee.com/weharmony/kernel_liteos_a_note/wikis/pages)查看
......
......@@ -699,13 +699,13 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, U
status_t status;
BOOL retVal = FALSE;
processCB->processMode = mode;//用户态进程还是内核态进程
processCB->processStatus = OS_PROCESS_STATUS_INIT;//进程初始状态
processCB->parentProcessID = OS_INVALID_VALUE;//爸爸进程,外面指定
processCB->threadGroupID = OS_INVALID_VALUE;//所属线程组
processCB->priority = priority;//进程优先级
processCB->policy = policy;//调度算法 LOS_SCHED_RR
processCB->umask = OS_PROCESS_DEFAULT_UMASK;//掩码
processCB->processMode = mode; //用户态进程还是内核态进程
processCB->processStatus = OS_PROCESS_STATUS_INIT; //进程初始状态
processCB->parentProcessID = OS_INVALID_VALUE; //爸爸进程,外面指定
processCB->threadGroupID = OS_INVALID_VALUE; //所属线程组
processCB->priority = priority; //进程优先级
processCB->policy = policy; //调度算法 LOS_SCHED_RR
processCB->umask = OS_PROCESS_DEFAULT_UMASK; //掩码
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
LOS_ListInit(&processCB->threadSiblingList);//初始化孩子任务/线程链表,上面挂的都是由此fork的孩子线程 见于 OsTaskCBInit LOS_ListTailInsert(&(processCB->threadSiblingList), &(taskCB->threadList));
......@@ -730,7 +730,7 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, U
return LOS_ENOMEM;
}
(VOID)memset_s(ttb, PAGE_SIZE, 0, PAGE_SIZE);//内存清0
retVal = OsUserVmSpaceInit(space, ttb);//初始化虚拟空间和本进程 mmu
retVal = OsUserVmSpaceInit(space, ttb);//初始化虚拟空间和进程mmu
vmPage = OsVmVaddrToPage(ttb);//通过虚拟地址拿到page
if ((retVal == FALSE) || (vmPage == NULL)) {//异常处理
PRINT_ERR("create space failed! ret: %d, vmPage: %#x\n", retVal, vmPage);
......@@ -872,7 +872,7 @@ STATIC UINT32 OsProcessCreateInit(LosProcessCB *processCB, UINT32 flags, const C
}
#endif
#ifdef LOSCFG_KERNEL_CPUP //CPU性能统计开关
#ifdef LOSCFG_KERNEL_CPUP //CPU性能统计开关,默认是打开的
OsCpupSet(processCB->processID);
#endif
......
......@@ -132,7 +132,7 @@ struct VmMapRegion {//线性区描述符,内核通过线性区管理虚拟地址
};
typedef struct VmSpace {
LOS_DL_LIST node; /**< vm space dl list */ //节点,通过它挂到全局虚拟空间链表上
LOS_DL_LIST node; /**< vm space dl list */ //节点,通过它挂到全局虚拟空间 g_vmSpaceList 链表上
LOS_DL_LIST regions; /**< region dl list */ //双循环链表方式管理本空间各个线性区
LosRbTree regionRbTree; /**< region red-black tree root */ //采用红黑树方式管理本空间各个线性区
LosMux regionMux; /**< region list mutex lock */ //虚拟空间的互斥锁
......@@ -140,10 +140,10 @@ typedef struct VmSpace {
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 */ //堆区
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 */ //MMU记录和物理地址的映射情况
LosArchMmu archMmu; /**< vm mapping physical memory */ //MMU记录<虚拟地址,物理地址>的映射情况
#ifdef LOSCFG_DRIVERS_TZDRIVER
VADDR_T codeStart; /**< user process code area start */
VADDR_T codeEnd; /**< user process code area end */
......
......@@ -124,7 +124,7 @@ ULONG_T OsRegionRbCmpKeyFn(VOID *pNodeKeyA, VOID *pNodeKeyB)
}
return RB_EQUAL;
}
//初始化虚拟空间
STATIC BOOL OsVmSpaceInitCommon(LosVmSpace *vmSpace, VADDR_T *virtTtb)
{
LOS_RbInitTree(&vmSpace->regionRbTree, OsRegionRbCmpKeyFn, OsRegionRbFreeFn, OsRegionRbGetKeyFn);//初始化虚拟存储空间-以红黑树组织方式
......@@ -140,7 +140,7 @@ STATIC BOOL OsVmSpaceInitCommon(LosVmSpace *vmSpace, VADDR_T *virtTtb)
LOS_ListAdd(&g_vmSpaceList, &vmSpace->node);//加入到虚拟空间双循环链表
(VOID)LOS_MuxRelease(&g_vmSpaceListMux);
return OsArchMmuInit(&vmSpace->archMmu, virtTtb);//对空间mmu初始化
return OsArchMmuInit(&vmSpace->archMmu, virtTtb);//对mmu初始化
}
VOID OsVmMapInit(VOID)
......@@ -1027,7 +1027,7 @@ VMM_ALLOC_SUCCEED:
(VOID)LOS_MuxRelease(&space->regionMux);
return err;
}
//申请虚拟内存
VOID *LOS_VMalloc(size_t size)//从g_vMallocSpace中申请物理内存
{
LosVmSpace *space = &g_vMallocSpace;
......@@ -1043,7 +1043,7 @@ VOID *LOS_VMalloc(size_t size)//从g_vMallocSpace中申请物理内存
if ((size == 0) || (size > space->size)) {
return NULL;
}
sizeCount = size >> PAGE_SHIFT;//按申请 所以需右移12位
sizeCount = size >> PAGE_SHIFT;//按页申请所以需右移12位
LOS_DL_LIST_HEAD(pageList);
(VOID)LOS_MuxAcquire(&space->regionMux);//获得互斥锁
......@@ -1108,7 +1108,7 @@ VOID LOS_VFree(const VOID *addr)
DONE:
(VOID)LOS_MuxRelease(&space->regionMux);
}
//分配大内存
STATIC INLINE BOOL OsMemLargeAlloc(UINT32 size)
{
UINT32 wasteMem;
......@@ -1120,7 +1120,7 @@ STATIC INLINE BOOL OsMemLargeAlloc(UINT32 size)
/* that is 1K ram wasted, waste too much mem ! */
return (wasteMem < VM_MAP_WASTE_MEM_LEVEL);//浪费大于1K时用伙伴算法
}
//内核空间内存分配
VOID *LOS_KernelMalloc(UINT32 size)
{
VOID *ptr = NULL;
......
......@@ -49,10 +49,10 @@
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
//检查用户空间虚拟内存参数
STATUS_T OsCheckMMapParams(VADDR_T vaddr, unsigned prot, unsigned long flags, size_t len, unsigned long pgoff)
{
if ((vaddr != 0) && !LOS_IsUserAddressRange(vaddr, len)) {
if ((vaddr != 0) && !LOS_IsUserAddressRange(vaddr, len)) {//因系统调用,[vaddr,vaddr+len]必须在用户空间
return -EINVAL;
}
......@@ -61,10 +61,10 @@ STATUS_T OsCheckMMapParams(VADDR_T vaddr, unsigned prot, unsigned long flags, si
}
/* we only support some prot and flags */
if ((prot & PROT_SUPPORT_MASK) == 0) {
if ((prot & PROT_SUPPORT_MASK) == 0) {//不能超过权限范围
return -EINVAL;
}
if ((flags & MAP_SUPPORT_MASK) == 0) {
if ((flags & MAP_SUPPORT_MASK) == 0) {//映射权限限制
return -EINVAL;
}
if (((flags & MAP_SHARED_PRIVATE) == 0) || ((flags & MAP_SHARED_PRIVATE) == MAP_SHARED_PRIVATE)) {
......@@ -77,7 +77,7 @@ STATUS_T OsCheckMMapParams(VADDR_T vaddr, unsigned prot, unsigned long flags, si
return LOS_OK;
}
//匿名映射 SWAP
//匿名映射指的是swap分区
STATUS_T OsAnonMMap(LosVmMapRegion *region)
{
LOS_SetRegionTypeAnon(region);
......@@ -159,7 +159,7 @@ MMAP_DONE:
(VOID)LOS_MuxRelease(&vmSpace->regionMux);
return resultVaddr;
}
//解除映射关系
STATUS_T LOS_UnMMap(VADDR_T addr, size_t size)
{
if ((addr <= 0) || (size <= 0)) {
......@@ -168,7 +168,7 @@ STATUS_T LOS_UnMMap(VADDR_T addr, size_t size)
return OsUnMMap(OsCurrProcessGet()->vmSpace, addr, size);
}
//用户进程向内核申请空间,进一步说用于扩展用户堆栈空间,或者回收用户堆栈空间
VOID *LOS_DoBrk(VOID *addr)
{
LosVmSpace *space = OsCurrProcessGet()->vmSpace;
......
......@@ -309,7 +309,7 @@ LITE_OS_SEC_TEXT STATIC INT32 DoIpcMmap(LosProcessCB *pcb, LosVmMapRegion *regio
(VOID)LOS_MuxRelease(&pcb->vmSpace->regionMux);
return ret;
}
//映射IPC线性区,IPC是单独
//将参数线性区设为IPC专用区
LITE_OS_SEC_TEXT STATIC int LiteIpcMmap(FAR struct file* filep, LosVmMapRegion *region)
{
int ret = 0;
......@@ -323,19 +323,19 @@ LITE_OS_SEC_TEXT STATIC int LiteIpcMmap(FAR struct file* filep, LosVmMapRegion *
if (IsPoolMapped()) {
return -EEXIST;
}
if (pcb->ipcInfo.pool.uvaddr != NULL) {
if (pcb->ipcInfo.pool.uvaddr != NULL) {//通过用户空间虚拟地址找到线性区
regionTemp = LOS_RegionFind(pcb->vmSpace, (VADDR_T)(UINTPTR)pcb->ipcInfo.pool.uvaddr);
if (regionTemp != NULL) {
if (regionTemp != NULL) {//
(VOID)LOS_RegionFree(pcb->vmSpace, regionTemp);
}
}
pcb->ipcInfo.pool.uvaddr = (VOID *)(UINTPTR)region->range.base;
pcb->ipcInfo.pool.uvaddr = (VOID *)(UINTPTR)region->range.base;//ipc绑定线性区
if (pcb->ipcInfo.pool.kvaddr != NULL) {
LOS_VFree(pcb->ipcInfo.pool.kvaddr);
pcb->ipcInfo.pool.kvaddr = NULL;
}
/* use vmalloc to alloc phy mem */
pcb->ipcInfo.pool.kvaddr = LOS_VMalloc(region->range.size);
pcb->ipcInfo.pool.kvaddr = LOS_VMalloc(region->range.size);//分配物理内存
if (pcb->ipcInfo.pool.kvaddr == NULL) {
ret = -ENOMEM;
goto ERROR_REGION_OUT;
......@@ -350,7 +350,7 @@ LITE_OS_SEC_TEXT STATIC int LiteIpcMmap(FAR struct file* filep, LosVmMapRegion *
ret = -EINVAL;
goto ERROR_MAP_OUT;
}
pcb->ipcInfo.pool.poolSize = region->range.size;
pcb->ipcInfo.pool.poolSize = region->range.size;//线性区
return 0;
ERROR_MAP_OUT:
LOS_VFree(pcb->ipcInfo.pool.kvaddr);
......@@ -359,7 +359,7 @@ ERROR_REGION_OUT:
pcb->ipcInfo.pool.kvaddr = NULL;
return ret;
}
//ipc池初始化
//ipc内存池初始化
LITE_OS_SEC_TEXT_INIT UINT32 LiteIpcPoolInit(ProcIpcInfo *ipcInfo)
{
ipcInfo->pool.uvaddr = NULL;
......
......@@ -67,8 +67,8 @@ typedef struct {//句柄信息
} HandleInfo;
typedef struct {// ipc池
VOID *uvaddr; //用户空间虚拟地址
VOID *kvaddr; //内核空间虚拟地址
VOID *uvaddr; //虚拟地址,指向进程的LiteIPC线性区基地址
VOID *kvaddr; //注意这里指的是物理地址
UINT32 poolSize;//ipc池大小
} IpcPool;
//见于进程结构体: LosProcessCB.ipcInfo
......@@ -182,10 +182,10 @@ typedef struct { //IPC消息内容回路,记录消息周期
#if (LOSCFG_KERNEL_TRACE == YES)
#define LOS_TRACE_IPC 3 //IPC 对应..\kernel\include\los_trace.h TraceType 理解
typedef enum {
WRITE,
WRITE_DROP,
TRY_READ,
typedef enum { //IPC包含哪些操作
WRITE, //写消息
WRITE_DROP,
TRY_READ,
READ,
READ_DROP,
READ_TIMEOUT,
......
git add -A
git commit -m '开始对 lite ipc模块注解
git commit -m '梳理内存模块的注解
搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册