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

完善进程部分注释,注释进程是怎么一步步被Fork的

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 62d5a098
...@@ -366,8 +366,8 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB) ...@@ -366,8 +366,8 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
} }
#ifdef LOSCFG_FS_VFS #ifdef LOSCFG_FS_VFS
if (OsProcessIsUserMode(processCB)) { if (OsProcessIsUserMode(processCB)) {//用户模式下
delete_files(processCB, processCB->files); delete_files(processCB, processCB->files);//删除文件
} }
processCB->files = NULL; processCB->files = NULL;
#endif #endif
...@@ -379,7 +379,7 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB) ...@@ -379,7 +379,7 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
} }
#endif #endif
OsSwtmrRecycle(processCB->processID); OsSwtmrRecycle(processCB->processID);//软件定时器回收
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID; processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
#ifdef LOSCFG_SECURITY_VID #ifdef LOSCFG_SECURITY_VID
...@@ -390,29 +390,29 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB) ...@@ -390,29 +390,29 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
#endif #endif
#if (LOSCFG_KERNEL_LITEIPC == YES) #if (LOSCFG_KERNEL_LITEIPC == YES)
if (OsProcessIsUserMode(processCB)) { if (OsProcessIsUserMode(processCB)) {//用户模式下
LiteIpcPoolDelete(&(processCB->ipcInfo)); LiteIpcPoolDelete(&(processCB->ipcInfo));//删除进程IPC
(VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo)); (VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo));
} }
#endif #endif
} }
//回收僵死状态进程流程
LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, ProcessGroup **group) LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, ProcessGroup **group)
{ {
OsExitProcessGroup(childCB, group); OsExitProcessGroup(childCB, group);//退出进程组
LOS_ListDelete(&childCB->siblingList); LOS_ListDelete(&childCB->siblingList);//从父亲大人的子孙链表上摘除
if (childCB->processStatus & OS_PROCESS_STATUS_ZOMBIES) { if (childCB->processStatus & OS_PROCESS_STATUS_ZOMBIES) {//如果身上僵死状态的标签
childCB->processStatus &= ~OS_PROCESS_STATUS_ZOMBIES; childCB->processStatus &= ~OS_PROCESS_STATUS_ZOMBIES;//去掉僵死标签
childCB->processStatus |= OS_PROCESS_FLAG_UNUSED; childCB->processStatus |= OS_PROCESS_FLAG_UNUSED;//贴上没使用标签,进程由进程池分配,进程退出后重新回到空闲进程池
} }
LOS_ListDelete(&childCB->pendList); LOS_ListDelete(&childCB->pendList);//将自己从阻塞链表上摘除,注意有很多原因引起阻塞,pendList挂在哪里就以为这属于哪类阻塞
if (childCB->processStatus & OS_PROCESS_FLAG_EXIT) { if (childCB->processStatus & OS_PROCESS_FLAG_EXIT) {//如果有退出标签
LOS_ListHeadInsert(&g_processRecyleList, &childCB->pendList);//注意g_processRecyleList挂的是pendList节点,所以要通过OS_PCB_FROM_PENDLIST找. LOS_ListHeadInsert(&g_processRecyleList, &childCB->pendList);//从头部插入,注意g_processRecyleList挂的是pendList节点,所以要通过OS_PCB_FROM_PENDLIST找.
} else if (childCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) { } else if (childCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) {//如果是进程组的组长
LOS_ListTailInsert(&g_processRecyleList, &childCB->pendList); LOS_ListTailInsert(&g_processRecyleList, &childCB->pendList);//从尾部插入,意思就是组长尽量最后一个处理
} else { } else {
OsInsertPCBToFreeList(childCB); OsInsertPCBToFreeList(childCB);//直接插到freeList中去,可用于重新分配了。
} }
} }
...@@ -448,7 +448,7 @@ STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB) ...@@ -448,7 +448,7 @@ STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
return; return;
} }
//孩子进程资源释放
STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB) STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB)
{ {
LosProcessCB *childCB = NULL; LosProcessCB *childCB = NULL;
...@@ -1963,13 +1963,13 @@ LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID) ...@@ -1963,13 +1963,13 @@ LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
LITE_OS_SEC_TEXT VOID OsProcessExit(LosTaskCB *runTask, INT32 status) LITE_OS_SEC_TEXT VOID OsProcessExit(LosTaskCB *runTask, INT32 status)
{ {
UINT32 intSave; UINT32 intSave;
LOS_ASSERT(runTask == OsCurrTaskGet()); LOS_ASSERT(runTask == OsCurrTaskGet());//只有当前进程才能调用这个函数
OsTaskResourcesToFree(runTask); OsTaskResourcesToFree(runTask);//释放任务资源
OsProcessResourcesToFree(OsCurrProcessGet()); OsProcessResourcesToFree(OsCurrProcessGet());//释放进程资源
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
OsProcessNaturalExit(runTask, status); OsProcessNaturalExit(runTask, status);//进程自然退出
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
} }
//接口封装 进程退出 //接口封装 进程退出
......
...@@ -679,7 +679,7 @@ LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB) ...@@ -679,7 +679,7 @@ LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
} }
return; return;
} }
//任务基本信息的初始化
LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB, LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
const VOID *stackPtr, const VOID *stackPtr,
const VOID *topStack, const VOID *topStack,
...@@ -702,14 +702,14 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB, ...@@ -702,14 +702,14 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
initParam->usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK; initParam->usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK;
#endif #endif
#if (LOSCFG_KERNEL_LITEIPC == YES) #if (LOSCFG_KERNEL_LITEIPC == YES)
LOS_ListInit(&(taskCB->msgListHead)); LOS_ListInit(&(taskCB->msgListHead));//初始化 liteipc的消息链表
(VOID)memset_s(taskCB->accessMap, sizeof(taskCB->accessMap), 0, sizeof(taskCB->accessMap)); (VOID)memset_s(taskCB->accessMap, sizeof(taskCB->accessMap), 0, sizeof(taskCB->accessMap));
#endif #endif
taskCB->policy = (initParam->policy == LOS_SCHED_FIFO) ? LOS_SCHED_FIFO : LOS_SCHED_RR; taskCB->policy = (initParam->policy == LOS_SCHED_FIFO) ? LOS_SCHED_FIFO : LOS_SCHED_RR;
taskCB->taskStatus = OS_TASK_STATUS_INIT; taskCB->taskStatus = OS_TASK_STATUS_INIT;
if (initParam->uwResved & OS_TASK_FLAG_DETACHED) { if (initParam->uwResved & OS_TASK_FLAG_DETACHED) {//分离模式 代表任务与其他任务的关系
taskCB->taskStatus |= OS_TASK_FLAG_DETACHED; taskCB->taskStatus |= OS_TASK_FLAG_DETACHED;
} else { } else {//参与模式
LOS_ListInit(&taskCB->joinList); LOS_ListInit(&taskCB->joinList);
taskCB->taskStatus |= OS_TASK_FLAG_PTHREAD_JOIN; taskCB->taskStatus |= OS_TASK_FLAG_PTHREAD_JOIN;
} }
...@@ -717,7 +717,7 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB, ...@@ -717,7 +717,7 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
taskCB->futex.index = OS_INVALID_VALUE; taskCB->futex.index = OS_INVALID_VALUE;
LOS_ListInit(&taskCB->lockList); LOS_ListInit(&taskCB->lockList);
} }
//任务初始化
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam, LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam,
const VOID *stackPtr, const VOID *topStack) const VOID *stackPtr, const VOID *topStack)
{ {
...@@ -727,7 +727,7 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_IN ...@@ -727,7 +727,7 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_IN
UINT16 mode; UINT16 mode;
LosProcessCB *processCB = NULL; LosProcessCB *processCB = NULL;
OsTaskCBInitBase(taskCB, stackPtr, topStack, initParam); OsTaskCBInitBase(taskCB, stackPtr, topStack, initParam);//初始化任务的基本信息
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
processCB = OS_PCB_FROM_PID(initParam->processID);//通过ID获取PCB ,单核进程数最多64个 processCB = OS_PCB_FROM_PID(initParam->processID);//通过ID获取PCB ,单核进程数最多64个
...@@ -741,12 +741,12 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_IN ...@@ -741,12 +741,12 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_IN
OsUserTaskStackInit(taskCB->stackPointer, taskCB->taskEntry, initParam->userParam.userSP);//用户任务栈上下文初始化 OsUserTaskStackInit(taskCB->stackPointer, taskCB->taskEntry, initParam->userParam.userSP);//用户任务栈上下文初始化
} }
if (!processCB->threadNumber) { if (!processCB->threadNumber) {//进程线程数量为0时,
processCB->threadGroupID = taskCB->taskID; processCB->threadGroupID = taskCB->taskID;//任务为线程组 组长
} }
processCB->threadNumber++;//这里说明 线程和TASK是一个意思 processCB->threadNumber++;//这里说明 线程和TASK是一个意思 threadNumber代表活动线程数
numCount = processCB->threadCount; numCount = processCB->threadCount;//代表总线程数,包括销毁的,只要存在过的都算,这个值也就是在这里用下,
processCB->threadCount++; processCB->threadCount++;
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
...@@ -794,7 +794,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S ...@@ -794,7 +794,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
VOID *pool = NULL; VOID *pool = NULL;
errRet = OsTaskCreateParamCheck(taskID, initParam, &pool); errRet = OsTaskCreateParamCheck(taskID, initParam, &pool);//参数检查
if (errRet != LOS_OK) { if (errRet != LOS_OK) {
return errRet; return errRet;
} }
...@@ -889,7 +889,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *in ...@@ -889,7 +889,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *in
return LOS_OK; return LOS_OK;
} }
//任务恢复
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID) LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
{ {
UINT32 intSave; UINT32 intSave;
...@@ -902,14 +902,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID) ...@@ -902,14 +902,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
return LOS_ERRNO_TSK_ID_INVALID; return LOS_ERRNO_TSK_ID_INVALID;
} }
taskCB = OS_TCB_FROM_TID(taskID); taskCB = OS_TCB_FROM_TID(taskID);//拿到任务实体
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
/* clear pending signal */ /* clear pending signal */
taskCB->signal &= ~SIGNAL_SUSPEND; taskCB->signal &= ~SIGNAL_SUSPEND;//清楚挂起信号
tempStatus = taskCB->taskStatus; tempStatus = taskCB->taskStatus;
if (tempStatus & OS_TASK_STATUS_UNUSED) { if (tempStatus & OS_TASK_STATUS_UNUSED) {//有未使用的标签
errRet = LOS_ERRNO_TSK_NOT_CREATED; errRet = LOS_ERRNO_TSK_NOT_CREATED;
OS_GOTO_ERREND(); OS_GOTO_ERREND();
} else if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) { } else if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) {
......
...@@ -90,7 +90,7 @@ typedef struct ProcessCB { ...@@ -90,7 +90,7 @@ typedef struct ProcessCB {
UINT32 exitCode; /**< process exit status */ UINT32 exitCode; /**< process exit status */
LOS_DL_LIST pendList; /**< Block list to which the process belongs */ LOS_DL_LIST pendList; /**< Block list to which the process belongs */
LOS_DL_LIST childrenList; /**< my children process list */ LOS_DL_LIST childrenList; /**< my children process list */
LOS_DL_LIST exitChildList; /**< my exit children process list */ LOS_DL_LIST exitChildList; /**< my exit children process list */ //那些要退出孩子进程链表,白发人送黑发人。
LOS_DL_LIST siblingList; /**< linkage in my parent's children list */ LOS_DL_LIST siblingList; /**< linkage in my parent's children list */
ProcessGroup *group; /**< Process group to which a process belongs */ ProcessGroup *group; /**< Process group to which a process belongs */
LOS_DL_LIST subordinateGroupList; /**< linkage in my group list */ LOS_DL_LIST subordinateGroupList; /**< linkage in my group list */
...@@ -99,9 +99,9 @@ typedef struct ProcessCB { ...@@ -99,9 +99,9 @@ typedef struct ProcessCB {
process */ process */
LOS_DL_LIST threadSiblingList; /**< List of threads under this process */ LOS_DL_LIST threadSiblingList; /**< List of threads under this process */
LOS_DL_LIST threadPriQueueList[OS_PRIORITY_QUEUE_NUM]; /**< The process's thread group schedules the LOS_DL_LIST threadPriQueueList[OS_PRIORITY_QUEUE_NUM]; /**< The process's thread group schedules the
priority hash table */ priority hash table */ //进程的线程组调度优先级哈希表
volatile UINT32 threadNumber; /**< Number of threads alive under this process */ volatile UINT32 threadNumber; /**< Number of threads alive under this process */ //此进程下的活动线程数
UINT32 threadCount; /**< Total number of threads created under this process */ UINT32 threadCount; /**< Total number of threads created under this process */ //在此进程下创建的线程总数
LOS_DL_LIST waitList; /**< The process holds the waitLits to support wait/waitpid */ LOS_DL_LIST waitList; /**< The process holds the waitLits to support wait/waitpid */
#if (LOSCFG_KERNEL_SMP == YES) #if (LOSCFG_KERNEL_SMP == YES)
UINT32 timerCpu; /**< CPU core number of this task is delayed or pended */ UINT32 timerCpu; /**< CPU core number of this task is delayed or pended */
......
...@@ -479,10 +479,10 @@ typedef VOID *(*TSK_ENTRY_FUNC)(UINTPTR param1, ...@@ -479,10 +479,10 @@ typedef VOID *(*TSK_ENTRY_FUNC)(UINTPTR param1,
* You are not allowed to add any fields and adjust fields to the structure * You are not allowed to add any fields and adjust fields to the structure
*/ */
typedef struct { typedef struct {
UINTPTR userArea; UINTPTR userArea;//用户区域
UINTPTR userSP; UINTPTR userSP; //用户模式下栈指针
UINTPTR userMapBase; UINTPTR userMapBase;//用户模式下映射基地址
UINT32 userMapSize; UINT32 userMapSize;//用户模式下映射大小
} UserTaskParam; } UserTaskParam;
/** /**
...@@ -505,7 +505,7 @@ typedef struct tagTskInitParam {//Task的初始化参数 ...@@ -505,7 +505,7 @@ typedef struct tagTskInitParam {//Task的初始化参数
It is unable to be deleted if set to 0. */ It is unable to be deleted if set to 0. */
UINT16 consoleID; /**< The console id of task belongs */ UINT16 consoleID; /**< The console id of task belongs */
UINT32 processID; UINT32 processID;
UserTaskParam userParam; UserTaskParam userParam; //用户参数
} TSK_INIT_PARAM_S; } TSK_INIT_PARAM_S;
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册