Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
鸿蒙内核源码分析
注释鸿蒙内核源码
提交
3c99c512
注释鸿蒙内核源码
项目概览
鸿蒙内核源码分析
/
注释鸿蒙内核源码
通知
270
Star
29
Fork
11
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
106
Wiki
分析
仓库
DevOps
项目成员
Pages
注释鸿蒙内核源码
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
106
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
3c99c512
编写于
4月 13, 2021
作者:
鸿蒙内核源码分析
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
进程回收过程注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://my.oschina.net/weharmony
上级
af76a9f9
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
90 addition
and
94 deletion
+90
-94
README.md
README.md
+60
-64
arch/arm/arm/src/los_exc.c
arch/arm/arm/src/los_exc.c
+2
-2
kernel/base/core/los_process.c
kernel/base/core/los_process.c
+16
-16
kernel/base/core/los_task.c
kernel/base/core/los_task.c
+1
-1
kernel/base/include/los_process_pri.h
kernel/base/include/los_process_pri.h
+9
-9
kernel/base/ipc/los_signal.c
kernel/base/ipc/los_signal.c
+1
-1
syscall/process_syscall.c
syscall/process_syscall.c
+1
-1
未找到文件。
README.md
浏览文件 @
3c99c512
此差异已折叠。
点击以展开。
arch/arm/arm/src/los_exc.c
浏览文件 @
3c99c512
...
...
@@ -540,7 +540,7 @@ STATIC VOID OsUserExcHandle(ExcContext *excBufAddr)
UINT32
currCpu
=
ArchCurrCpuid
();
LosProcessCB
*
runProcess
=
OsCurrProcessGet
();
if
(
g_excFromUserMode
[
ArchCurrCpuid
()]
==
FALSE
)
{
//内核态直接退出,
8
处理了.
if
(
g_excFromUserMode
[
ArchCurrCpuid
()]
==
FALSE
)
{
//内核态直接退出,
不
处理了.
return
;
}
...
...
@@ -572,7 +572,7 @@ STATIC VOID OsUserExcHandle(ExcContext *excBufAddr)
#endif
OsProcessExitCodeSignalSet
(
runProcess
,
SIGUSR2
);
/* kill user exc process */
LOS_Exit
(
OS_PRO_EXIT_OK
);
LOS_Exit
(
OS_PRO_EXIT_OK
);
//进程退出
/* User mode exception handling failed , which normally does not exist */
//用户态的异常处理失败,通常情况下不会发生
g_curNestCount
[
currCpu
]
++
;
...
...
kernel/base/core/los_process.c
浏览文件 @
3c99c512
...
...
@@ -420,7 +420,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, Proc
OsInsertPCBToFreeList
(
childCB
);
//直接插到freeList中去,可用于重新分配了。
}
}
//当一个进程自然退出的时候,它的孩子进程
要怎么处理
//当一个进程自然退出的时候,它的孩子进程
由两位老祖宗收养
STATIC
VOID
OsDealAliveChildProcess
(
LosProcessCB
*
processCB
)
{
UINT32
parentID
;
...
...
@@ -430,25 +430,25 @@ STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
LOS_DL_LIST
*
childHead
=
NULL
;
if
(
!
LOS_ListEmpty
(
&
processCB
->
childrenList
))
{
//如果存在孩子进程
childHead
=
processCB
->
childrenList
.
pstNext
;
LOS_ListDelete
(
&
(
processCB
->
childrenList
));
childHead
=
processCB
->
childrenList
.
pstNext
;
//获取孩子链表
LOS_ListDelete
(
&
(
processCB
->
childrenList
));
//清空自己的孩子链表
if
(
OsProcessIsUserMode
(
processCB
))
{
//是用户态进程
parentID
=
g_userInitProcess
;
//
指定1号进程父ID
parentID
=
g_userInitProcess
;
//
用户态进程老祖宗
}
else
{
parentID
=
g_kernelInitProcess
;
//
指定2号进程为父ID
parentID
=
g_kernelInitProcess
;
//
内核态进程老祖宗
}
for
(
nextList
=
childHead
;
;)
{
childCB
=
OS_PCB_FROM_SIBLIST
(
nextList
);
childCB
->
parentProcessID
=
parentID
;
nextList
=
nextList
->
pstNext
;
if
(
nextList
==
childHead
)
{
for
(
nextList
=
childHead
;
;)
{
//遍历孩子链表
childCB
=
OS_PCB_FROM_SIBLIST
(
nextList
);
//找到孩子的真身
childCB
->
parentProcessID
=
parentID
;
//孩子磕头认老祖宗为爸爸
nextList
=
nextList
->
pstNext
;
//找下一个孩子进程
if
(
nextList
==
childHead
)
{
//一圈下来,孩子们都磕完头了
break
;
}
}
parentCB
=
OS_PCB_FROM_PID
(
parentID
);
LOS_ListTailInsertList
(
&
parentCB
->
childrenList
,
childHead
);
parentCB
=
OS_PCB_FROM_PID
(
parentID
);
//找个老祖宗的真身
LOS_ListTailInsertList
(
&
parentCB
->
childrenList
,
childHead
);
//挂到老祖宗的孩子链表上
}
return
;
...
...
@@ -1275,11 +1275,11 @@ STATIC UINT32 OsWaitOptionsCheck(UINT32 options)
UINT32
flag
=
LOS_WAIT_WNOHANG
|
LOS_WAIT_WUNTRACED
|
LOS_WAIT_WCONTINUED
;
flag
=
~
flag
&
options
;
if
(
flag
!=
0
)
{
if
(
flag
!=
0
)
{
//三种方式中一种都没有
return
LOS_EINVAL
;
//无效参数
}
if
((
options
&
(
LOS_WAIT_WCONTINUED
|
LOS_WAIT_WUNTRACED
))
!=
0
)
{
if
((
options
&
(
LOS_WAIT_WCONTINUED
|
LOS_WAIT_WUNTRACED
))
!=
0
)
{
//暂不支持这两种方式.
return
LOS_EOPNOTSUPP
;
//不支持
}
...
...
@@ -1299,7 +1299,7 @@ LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, V
LosProcessCB
*
processCB
=
NULL
;
LosTaskCB
*
runTask
=
NULL
;
ret
=
OsWaitOptionsCheck
(
options
);
//参数检查
只支持 LOS_WAIT_WNOHANG | LOS_WAIT_WUNTRACED
ret
=
OsWaitOptionsCheck
(
options
);
//参数检查
,只支持LOS_WAIT_WNOHANG
if
(
ret
!=
LOS_OK
)
{
return
-
ret
;
}
...
...
@@ -1318,7 +1318,7 @@ LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, V
return
OsWaitRecycleChildPorcess
(
childCB
,
intSave
,
status
);
//回收进程
}
//没有找到,看是否要返回还是去做个登记
if
((
options
&
LOS_WAIT_WNOHANG
)
!=
0
)
{
//
不登记的方式,立即返回
if
((
options
&
LOS_WAIT_WNOHANG
)
!=
0
)
{
//
有LOS_WAIT_WNOHANG标签
runTask
->
waitFlag
=
0
;
//等待标识置0
pid
=
0
;
//这里置0,是为了 return 0
goto
ERROR
;
...
...
kernel/base/core/los_task.c
浏览文件 @
3c99c512
...
...
@@ -1140,7 +1140,7 @@ STATIC INLINE VOID OsTaskReleaseHoldLock(LosProcessCB *processCB, LosTaskCB *tas
OsTaskSyncWake
(
taskCB
);
//同步唤醒任务
}
//
//
删除一个正在运行的任务
//删除一个正在运行的任务
LITE_OS_SEC_TEXT
VOID
OsRunTaskToDelete
(
LosTaskCB
*
taskCB
)
{
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
taskCB
->
processID
);
//拿到task所属进程
...
...
kernel/base/include/los_process_pri.h
浏览文件 @
3c99c512
...
...
@@ -338,18 +338,18 @@ STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)//用户模
* 31 15 8 7 0
* | | exit code | core dump | signal |
*/
#define OS_PRO_EXIT_OK 0 //进程退出
//
以下函数都是进程的退出方式
#define OS_PRO_EXIT_OK 0 //进程
正常
退出
//
置进程退出码第七位为1
STATIC
INLINE
VOID
OsProcessExitCodeCoreDumpSet
(
LosProcessCB
*
processCB
)
{
processCB
->
exitCode
|=
0x80U
;
// 0b10000000
对应退出码为看
processCB
->
exitCode
|=
0x80U
;
// 0b10000000
}
//设置进程退出信号(0 ~ 7)
STATIC
INLINE
VOID
OsProcessExitCodeSignalSet
(
LosProcessCB
*
processCB
,
UINT32
signal
)
{
processCB
->
exitCode
|=
signal
&
0x7FU
;
//0b01111111
}
//清除进程退出信号(0 ~ 7)
STATIC
INLINE
VOID
OsProcessExitCodeSignalClear
(
LosProcessCB
*
processCB
)
{
processCB
->
exitCode
&=
(
~
0x7FU
);
//低7位全部清0
...
...
@@ -359,8 +359,8 @@ STATIC INLINE BOOL OsProcessExitCodeSignalIsSet(LosProcessCB *processCB)
{
return
(
processCB
->
exitCode
)
&
0x7FU
;
}
STATIC
INLINE
VOID
OsProcessExitCodeSet
(
LosProcessCB
*
processCB
,
UINT32
code
)
//由外界提供退出码
//设置进程退出号(8 ~ 15)
STATIC
INLINE
VOID
OsProcessExitCodeSet
(
LosProcessCB
*
processCB
,
UINT32
code
)
{
processCB
->
exitCode
|=
((
code
&
0x000000FFU
)
<<
8U
)
&
0x0000FF00U
;
/* 8: Move 8 bits to the left, exitCode */
}
...
...
@@ -426,14 +426,14 @@ STATIC INLINE User *OsCurrUserGet(VOID)//获取当前进程的所属用户
/*
* return immediately if no child has exited.
*/
#define LOS_WAIT_WNOHANG (1 << 0U) //如果没有孩子
退出,请立即返回 no hang
#define LOS_WAIT_WNOHANG (1 << 0U) //如果没有孩子
进程退出,则立即返回,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
/*
* return if a child has stopped (but not traced via ptrace(2)).
* Status for traced children which have stopped is provided even
* if this option is not specified.
*/
#define LOS_WAIT_WUNTRACED (1 << 1U) //如果子进程进入暂停
执行情况则马上返回,但结束状态不予以理会
。untraced
#define LOS_WAIT_WUNTRACED (1 << 1U) //如果子进程进入暂停
情况则马上返回,不予以理会结束状态
。untraced
/*
* return if a stopped child has been resumed by delivery of SIGCONT.
...
...
kernel/base/ipc/los_signal.c
浏览文件 @
3c99c512
...
...
@@ -608,7 +608,7 @@ void OsSaveSignalContext(unsigned int *sp)
/* One pthread do the share signal */
sigcb
->
sigFlag
|=
process
->
sigShare
;
//记录由一个线程执行可进程的共享信号,这些恢复上下文时就找到对应的任务
unsigned
int
signo
=
(
unsigned
int
)
FindFirstSetedBit
(
sigcb
->
sigFlag
)
+
1
;
OsProcessExitCodeSignalSet
(
process
,
signo
);
OsProcessExitCodeSignalSet
(
process
,
signo
);
//设置进程退出信号
sigcb
->
context
.
CPSR
=
cpsr
;
//保存当前各寄存器的信息
sigcb
->
context
.
PC
=
sp
[
REG_PC
];
//获取被打断现场寄存器的值
sigcb
->
context
.
USP
=
sp
[
REG_SP
];
...
...
syscall/process_syscall.c
浏览文件 @
3c99c512
...
...
@@ -308,7 +308,7 @@ int SysSchedRRGetInterval(int pid, struct timespec *tp)
return
0
;
}
//
阻塞参数进程
//
等待子进程结束
int
SysWait
(
int
pid
,
USER
int
*
status
,
int
options
,
void
*
rusage
)
{
(
void
)
rusage
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录