diff --git a/kernel/base/core/los_process.c b/kernel/base/core/los_process.c index 29597dd6826d2d6c4c8685a5e38ff6821221206b..2b1416654de02606eb3d9413d6b76ae3e18fae65 100644 --- a/kernel/base/core/los_process.c +++ b/kernel/base/core/los_process.c @@ -454,15 +454,16 @@ STATIC UINT32 OsProcessInit(VOID) LOS_ListTailInsert(&g_freeProcess, &g_processCBArray[index].pendList);//注意g_freeProcess挂的是pendList节点,所以使用要通过OS_PCB_FROM_PENDLIST找到进程实体. } - g_kernelIdleProcess = 0; /* 0: The idle process ID of the kernel-mode process is fixed at 0 */ - LOS_ListDelete(&OS_PCB_FROM_PID(g_kernelIdleProcess)->pendList); + g_kernelIdleProcess = 0; /* 0: The idle process ID of the kernel-mode process is fixed at 0 *///内核态init进程,从名字可以看出来这是让cpu休息的进程. + LOS_ListDelete(&OS_PCB_FROM_PID(g_kernelIdleProcess)->pendList);//从空闲链表中摘掉 + g_userInitProcess = 1; /* 1: The root process ID of the user-mode process is fixed at 1 *///用户态的根进程 - LOS_ListDelete(&OS_PCB_FROM_PID(g_userInitProcess)->pendList); + LOS_ListDelete(&OS_PCB_FROM_PID(g_userInitProcess)->pendList);//从空闲链表中摘掉 g_kernelInitProcess = 2; /* 2: The root process ID of the kernel-mode process is fixed at 2 *///内核态的根进程 - LOS_ListDelete(&OS_PCB_FROM_PID(g_kernelInitProcess)->pendList); + LOS_ListDelete(&OS_PCB_FROM_PID(g_kernelInitProcess)->pendList);//从空闲链表中摘掉 - //注意:这波骚操作之后,g_freeProcess链表上还有,0,3,4,...g_processMaxNum-1号进程.创建进程是从g_freeProcess上申请 + //注意:这波骚操作之后,g_freeProcess链表上还有[3,g_processMaxNum-1]号进程.创建进程是从g_freeProcess上申请 //即下次申请到的将是0号进程,而 OsCreateIdleProcess 将占有0号进程. return LOS_OK; @@ -737,7 +738,7 @@ EXIT: OsDeInitPCB(processCB);//删除进程控制块,归还内存 return ret; } -//初始化 2号进程,即内核态进程的老祖宗 +//创建2,0号进程,即内核态进程的老祖宗 LITE_OS_SEC_TEXT_INIT UINT32 OsSystemProcessCreate(VOID) { UINT32 ret = OsProcessInit(); @@ -745,39 +746,39 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSystemProcessCreate(VOID) return ret; } - LosProcessCB *kerInitProcess = OS_PCB_FROM_PID(g_kernelInitProcess); - ret = OsProcessCreateInit(kerInitProcess, OS_KERNEL_MODE, "KProcess", 0); + LosProcessCB *kerInitProcess = OS_PCB_FROM_PID(g_kernelInitProcess);//获取进程池中2号实体 + ret = OsProcessCreateInit(kerInitProcess, OS_KERNEL_MODE, "KProcess", 0);//创建内核态祖宗进程 if (ret != LOS_OK) { return ret; } - kerInitProcess->processStatus &= ~OS_PROCESS_STATUS_INIT; - g_processGroup = kerInitProcess->group; - LOS_ListInit(&g_processGroup->groupList); - OsCurrProcessSet(kerInitProcess); + kerInitProcess->processStatus &= ~OS_PROCESS_STATUS_INIT;//去掉初始化标签 + g_processGroup = kerInitProcess->group;//进程组ID就是2号进程本身 + LOS_ListInit(&g_processGroup->groupList);//初始化进程组链表 + OsCurrProcessSet(kerInitProcess);//设置为当前进程,注意当前进程是内核的视角,并不代表一旦设置就必须执行进程的任务. - ret = OsCreateResourceFreeTask(); + ret = OsCreateResourceFreeTask();//创建资源回收任务 if (ret != LOS_OK) { return ret; } - LosProcessCB *idleProcess = OS_PCB_FROM_PID(g_kernelIdleProcess); - ret = OsInitPCB(idleProcess, OS_KERNEL_MODE, OS_TASK_PRIORITY_LOWEST, "KIdle"); + LosProcessCB *idleProcess = OS_PCB_FROM_PID(g_kernelIdleProcess);//获取进程池中0号实体 + ret = OsInitPCB(idleProcess, OS_KERNEL_MODE, OS_TASK_PRIORITY_LOWEST, "KIdle");//创建内核态0号进程 if (ret != LOS_OK) { return ret; } - idleProcess->parentProcessID = kerInitProcess->processID; - LOS_ListTailInsert(&kerInitProcess->childrenList, &idleProcess->siblingList); - idleProcess->group = kerInitProcess->group; - LOS_ListTailInsert(&kerInitProcess->group->processList, &idleProcess->subordinateGroupList); - idleProcess->user = kerInitProcess->user; - idleProcess->files = kerInitProcess->files; + idleProcess->parentProcessID = kerInitProcess->processID;//认2号进程为父,它可是长子. + LOS_ListTailInsert(&kerInitProcess->childrenList, &idleProcess->siblingList);//挂到内核态祖宗进程的子孙链接上 + idleProcess->group = kerInitProcess->group;//和老祖宗一个进程组,注意是父子并不代表是朋友. + LOS_ListTailInsert(&kerInitProcess->group->processList, &idleProcess->subordinateGroupList);//挂到老祖宗的进程组链表上,进入了老祖宗的朋友圈. + idleProcess->user = kerInitProcess->user;//共享用户 + idleProcess->files = kerInitProcess->files;//共享文件 - ret = OsIdleTaskCreate(); + ret = OsIdleTaskCreate();//创建cpu的idle任务,从此当前CPU OsPercpuGet()->idleTaskID 有了休息的地方. if (ret != LOS_OK) { return ret; } - idleProcess->threadGroupID = OsPercpuGet()->idleTaskID; + idleProcess->threadGroupID = OsPercpuGet()->idleTaskID;//设置进程的多线程组长 return LOS_OK; } diff --git a/kernel/common/los_config.c b/kernel/common/los_config.c index 0d30148d9ce355fc2b22d62fa44f98e9260fd5d6..abb0c3cc7634893f50a40e9adb68959f9ed7c863 100644 --- a/kernel/common/los_config.c +++ b/kernel/common/los_config.c @@ -291,7 +291,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) } #endif - ret = OsSystemProcessCreate(); + ret = OsSystemProcessCreate();//创建系统进程 即:2 和 0 进程 if (ret != LOS_OK) { return ret; } diff --git a/kernel/extended/dynload/src/los_exec_elf.c b/kernel/extended/dynload/src/los_exec_elf.c index f1934daf696fd8278056b1d36620f27db7cea2dd..16d077640cdd67059600905b3c62f4cdbb8968d8 100644 --- a/kernel/extended/dynload/src/los_exec_elf.c +++ b/kernel/extended/dynload/src/los_exec_elf.c @@ -114,7 +114,7 @@ STATIC INT32 OsCopyUserParam(ELFLoadInfo *loadInfo, const CHAR *fileName, CHAR * loadInfo->fileName = kfileName; return LOS_OK; } - +//运行用户态进程 INT32 LOS_DoExecveFile(const CHAR *fileName, CHAR * const *argv, CHAR * const *envp) { ELFLoadInfo loadInfo = { 0 }; diff --git a/kernel/user/src/los_user_init.c b/kernel/user/src/los_user_init.c index ea1aff817152038231cc8857f3f76903a7112adb..c48164dbe486a4362a76c040665a12f1628f57c2 100644 --- a/kernel/user/src/los_user_init.c +++ b/kernel/user/src/los_user_init.c @@ -64,7 +64,7 @@ LITE_USER_SEC_TEXT STATIC UINT32 sys_call3(UINT32 nbr, UINT32 parm1, UINT32 parm LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args) { #ifdef LOSCFG_KERNEL_DYNLOAD - sys_call3(__NR_execve, (UINTPTR)g_initPath, 0, 0); + sys_call3(__NR_execve, (UINTPTR)g_initPath, 0, 0);//发起系统调用,陷入内核态,对应 SysExecve ,加载elf运行 #endif while (true) { } diff --git a/syscall/fs_syscall.c b/syscall/fs_syscall.c index 23c8dd85e7894cbb4a77416576b7da81a2597ea5..162915c72d8eb9290d1eb505a0a4d2b03cc390d2 100644 --- a/syscall/fs_syscall.c +++ b/syscall/fs_syscall.c @@ -400,7 +400,7 @@ OUT: } return ret; } - +//动态加载程序过程 #ifdef LOSCFG_KERNEL_DYNLOAD int SysExecve(const char *fileName, char *const *argv, char *const *envp) { diff --git a/zzz/git/push.sh b/zzz/git/push.sh index b6b2d85a0fae780adf3fcd1a7b8469fd828c8e74..6f417558b8523ace607d4f8fb5f548a29ff4654c 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m '重大更新!!! 中文注解版已同步官方2021/04/21号版本. +git commit -m '注解0号进程 百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码 https://my.oschina.net/weharmony '