提交 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)
}
#ifdef LOSCFG_FS_VFS
if (OsProcessIsUserMode(processCB)) {
delete_files(processCB, processCB->files);
if (OsProcessIsUserMode(processCB)) {//用户模式下
delete_files(processCB, processCB->files);//删除文件
}
processCB->files = NULL;
#endif
......@@ -379,7 +379,7 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
}
#endif
OsSwtmrRecycle(processCB->processID);
OsSwtmrRecycle(processCB->processID);//软件定时器回收
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
#ifdef LOSCFG_SECURITY_VID
......@@ -390,29 +390,29 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
#endif
#if (LOSCFG_KERNEL_LITEIPC == YES)
if (OsProcessIsUserMode(processCB)) {
LiteIpcPoolDelete(&(processCB->ipcInfo));
if (OsProcessIsUserMode(processCB)) {//用户模式下
LiteIpcPoolDelete(&(processCB->ipcInfo));//删除进程IPC
(VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo));
}
#endif
}
//回收僵死状态进程流程
LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, ProcessGroup **group)
{
OsExitProcessGroup(childCB, group);
LOS_ListDelete(&childCB->siblingList);
if (childCB->processStatus & OS_PROCESS_STATUS_ZOMBIES) {
childCB->processStatus &= ~OS_PROCESS_STATUS_ZOMBIES;
childCB->processStatus |= OS_PROCESS_FLAG_UNUSED;
OsExitProcessGroup(childCB, group);//退出进程组
LOS_ListDelete(&childCB->siblingList);//从父亲大人的子孙链表上摘除
if (childCB->processStatus & OS_PROCESS_STATUS_ZOMBIES) {//如果身上僵死状态的标签
childCB->processStatus &= ~OS_PROCESS_STATUS_ZOMBIES;//去掉僵死标签
childCB->processStatus |= OS_PROCESS_FLAG_UNUSED;//贴上没使用标签,进程由进程池分配,进程退出后重新回到空闲进程池
}
LOS_ListDelete(&childCB->pendList);
if (childCB->processStatus & OS_PROCESS_FLAG_EXIT) {
LOS_ListHeadInsert(&g_processRecyleList, &childCB->pendList);//注意g_processRecyleList挂的是pendList节点,所以要通过OS_PCB_FROM_PENDLIST找.
} else if (childCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) {
LOS_ListTailInsert(&g_processRecyleList, &childCB->pendList);
LOS_ListDelete(&childCB->pendList);//将自己从阻塞链表上摘除,注意有很多原因引起阻塞,pendList挂在哪里就以为这属于哪类阻塞
if (childCB->processStatus & OS_PROCESS_FLAG_EXIT) {//如果有退出标签
LOS_ListHeadInsert(&g_processRecyleList, &childCB->pendList);//从头部插入,注意g_processRecyleList挂的是pendList节点,所以要通过OS_PCB_FROM_PENDLIST找.
} else if (childCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) {//如果是进程组的组长
LOS_ListTailInsert(&g_processRecyleList, &childCB->pendList);//从尾部插入,意思就是组长尽量最后一个处理
} else {
OsInsertPCBToFreeList(childCB);
OsInsertPCBToFreeList(childCB);//直接插到freeList中去,可用于重新分配了。
}
}
......@@ -448,7 +448,7 @@ STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
return;
}
//孩子进程资源释放
STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB)
{
LosProcessCB *childCB = NULL;
......@@ -1963,13 +1963,13 @@ LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
LITE_OS_SEC_TEXT VOID OsProcessExit(LosTaskCB *runTask, INT32 status)
{
UINT32 intSave;
LOS_ASSERT(runTask == OsCurrTaskGet());
LOS_ASSERT(runTask == OsCurrTaskGet());//只有当前进程才能调用这个函数
OsTaskResourcesToFree(runTask);
OsProcessResourcesToFree(OsCurrProcessGet());
OsTaskResourcesToFree(runTask);//释放任务资源
OsProcessResourcesToFree(OsCurrProcessGet());//释放进程资源
SCHEDULER_LOCK(intSave);
OsProcessNaturalExit(runTask, status);
OsProcessNaturalExit(runTask, status);//进程自然退出
SCHEDULER_UNLOCK(intSave);
}
//接口封装 进程退出
......
......@@ -679,7 +679,7 @@ LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
}
return;
}
//任务基本信息的初始化
LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
const VOID *stackPtr,
const VOID *topStack,
......@@ -702,14 +702,14 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
initParam->usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK;
#endif
#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));
#endif
taskCB->policy = (initParam->policy == LOS_SCHED_FIFO) ? LOS_SCHED_FIFO : LOS_SCHED_RR;
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;
} else {
} else {//参与模式
LOS_ListInit(&taskCB->joinList);
taskCB->taskStatus |= OS_TASK_FLAG_PTHREAD_JOIN;
}
......@@ -717,7 +717,7 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
taskCB->futex.index = OS_INVALID_VALUE;
LOS_ListInit(&taskCB->lockList);
}
//任务初始化
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam,
const VOID *stackPtr, const VOID *topStack)
{
......@@ -727,7 +727,7 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_IN
UINT16 mode;
LosProcessCB *processCB = NULL;
OsTaskCBInitBase(taskCB, stackPtr, topStack, initParam);
OsTaskCBInitBase(taskCB, stackPtr, topStack, initParam);//初始化任务的基本信息
SCHEDULER_LOCK(intSave);
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
OsUserTaskStackInit(taskCB->stackPointer, taskCB->taskEntry, initParam->userParam.userSP);//用户任务栈上下文初始化
}
if (!processCB->threadNumber) {
processCB->threadGroupID = taskCB->taskID;
if (!processCB->threadNumber) {//进程线程数量为0时,
processCB->threadGroupID = taskCB->taskID;//任务为线程组 组长
}
processCB->threadNumber++;//这里说明 线程和TASK是一个意思
processCB->threadNumber++;//这里说明 线程和TASK是一个意思 threadNumber代表活动线程数
numCount = processCB->threadCount;
numCount = processCB->threadCount;//代表总线程数,包括销毁的,只要存在过的都算,这个值也就是在这里用下,
processCB->threadCount++;
SCHEDULER_UNLOCK(intSave);
......@@ -794,7 +794,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S
LosTaskCB *taskCB = NULL;
VOID *pool = NULL;
errRet = OsTaskCreateParamCheck(taskID, initParam, &pool);
errRet = OsTaskCreateParamCheck(taskID, initParam, &pool);//参数检查
if (errRet != LOS_OK) {
return errRet;
}
......@@ -889,7 +889,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *in
return LOS_OK;
}
//任务恢复
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
{
UINT32 intSave;
......@@ -902,14 +902,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
return LOS_ERRNO_TSK_ID_INVALID;
}
taskCB = OS_TCB_FROM_TID(taskID);
taskCB = OS_TCB_FROM_TID(taskID);//拿到任务实体
SCHEDULER_LOCK(intSave);
/* clear pending signal */
taskCB->signal &= ~SIGNAL_SUSPEND;
taskCB->signal &= ~SIGNAL_SUSPEND;//清楚挂起信号
tempStatus = taskCB->taskStatus;
if (tempStatus & OS_TASK_STATUS_UNUSED) {
if (tempStatus & OS_TASK_STATUS_UNUSED) {//有未使用的标签
errRet = LOS_ERRNO_TSK_NOT_CREATED;
OS_GOTO_ERREND();
} else if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) {
......
......@@ -90,7 +90,7 @@ typedef struct ProcessCB {
UINT32 exitCode; /**< process exit status */
LOS_DL_LIST pendList; /**< Block list to which the process belongs */
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 */
ProcessGroup *group; /**< Process group to which a process belongs */
LOS_DL_LIST subordinateGroupList; /**< linkage in my group list */
......@@ -99,9 +99,9 @@ typedef struct ProcessCB {
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
priority hash table */
volatile UINT32 threadNumber; /**< Number of threads alive under this process */
UINT32 threadCount; /**< Total number of threads created under this process */
priority hash table */ //进程的线程组调度优先级哈希表
volatile UINT32 threadNumber; /**< Number of threads alive 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 */
#if (LOSCFG_KERNEL_SMP == YES)
UINT32 timerCpu; /**< CPU core number of this task is delayed or pended */
......
......@@ -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
*/
typedef struct {
UINTPTR userArea;
UINTPTR userSP;
UINTPTR userMapBase;
UINT32 userMapSize;
UINTPTR userArea;//用户区域
UINTPTR userSP; //用户模式下栈指针
UINTPTR userMapBase;//用户模式下映射基地址
UINT32 userMapSize;//用户模式下映射大小
} UserTaskParam;
/**
......@@ -505,7 +505,7 @@ typedef struct tagTskInitParam {//Task的初始化参数
It is unable to be deleted if set to 0. */
UINT16 consoleID; /**< The console id of task belongs */
UINT32 processID;
UserTaskParam userParam;
UserTaskParam userParam; //用户参数
} TSK_INIT_PARAM_S;
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册