Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
berryhaxby
注释鸿蒙内核源码
提交
bb1b1f85
注释鸿蒙内核源码
项目概览
berryhaxby
/
注释鸿蒙内核源码
与 Fork 源项目一致
Fork自
鸿蒙内核源码分析 / 注释鸿蒙内核源码
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
注释鸿蒙内核源码
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bb1b1f85
编写于
10月 25, 2020
作者:
鸿蒙内核源码分析
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
鸿蒙源码分析系列篇
https://blog.csdn.net/kuangyufei
https://my.oschina.net/u/3751245
上级
d99011b6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
36 addition
and
36 deletion
+36
-36
kernel/base/core/los_process.c
kernel/base/core/los_process.c
+36
-36
未找到文件。
kernel/base/core/los_process.c
浏览文件 @
bb1b1f85
...
...
@@ -73,8 +73,8 @@ LITE_OS_SEC_BSS UINT32 g_userInitProcess = OS_INVALID_VALUE;// 用户态的初
LITE_OS_SEC_BSS
UINT32
g_kernelInitProcess
=
OS_INVALID_VALUE
;
// 内核态初始Kprocess进程,内核态下其他进程由它 fork
LITE_OS_SEC_BSS
UINT32
g_kernelIdleProcess
=
OS_INVALID_VALUE
;
// 内核态idle进程,由Kprocess fork
LITE_OS_SEC_BSS
UINT32
g_processMaxNum
;
// 进程最大数量
LITE_OS_SEC_BSS
ProcessGroup
*
g_processGroup
=
NULL
;
// 进程组
//将task从该进程的就绪队列中
删
除
LITE_OS_SEC_BSS
ProcessGroup
*
g_processGroup
=
NULL
;
//
全局进程组,负责管理所有
进程组
//将task从该进程的就绪队列中
摘除,如果需要进程也从进程就绪队列中摘
除
LITE_OS_SEC_TEXT_INIT
VOID
OsTaskSchedQueueDequeue
(
LosTaskCB
*
taskCB
,
UINT16
status
)
{
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
taskCB
->
processID
);
//从进程池中取进程
...
...
@@ -150,48 +150,48 @@ STATIC INLINE VOID OsInsertPCBToFreeList(LosProcessCB *processCB)
processCB
->
timerID
=
(
timer_t
)(
UINTPTR
)
MAX_INVALID_TIMER_VID
;
//timeID初始化值
LOS_ListTailInsert
(
&
g_freeProcess
,
&
processCB
->
pendList
);
//进程节点挂入g_freeProcess以分配给后续进程使用
}
//创建进程组
STATIC
ProcessGroup
*
OsCreateProcessGroup
(
UINT32
pid
)
{
LosProcessCB
*
processCB
=
NULL
;
ProcessGroup
*
group
=
LOS_MemAlloc
(
m_aucSysMem1
,
sizeof
(
ProcessGroup
));
ProcessGroup
*
group
=
LOS_MemAlloc
(
m_aucSysMem1
,
sizeof
(
ProcessGroup
));
//从内存池中分配进程组结构体
if
(
group
==
NULL
)
{
return
NULL
;
}
group
->
groupID
=
pid
;
LOS_ListInit
(
&
group
->
processList
);
LOS_ListInit
(
&
group
->
exitProcessList
);
group
->
groupID
=
pid
;
//参数当进程组ID
LOS_ListInit
(
&
group
->
processList
);
//初始化进程链表,这里把组内的进程都挂上去
LOS_ListInit
(
&
group
->
exitProcessList
);
//初始化退出进程链表,这里挂退出的进程
processCB
=
OS_PCB_FROM_PID
(
pid
);
LOS_ListTailInsert
(
&
group
->
processList
,
&
processCB
->
subordinateGroupList
);
processCB
->
group
=
group
;
processCB
->
processStatus
|=
OS_PROCESS_FLAG_GROUP_LEADER
;
if
(
g_processGroup
!=
NULL
)
{
LOS_ListTailInsert
(
&
g_processGroup
->
groupList
,
&
group
->
groupList
);
processCB
=
OS_PCB_FROM_PID
(
pid
);
//通过pid获得进程实体
LOS_ListTailInsert
(
&
group
->
processList
,
&
processCB
->
subordinateGroupList
);
//通过subordinateGroupList挂在进程组上,自然后续要通过它来找到进程实体
processCB
->
group
=
group
;
//设置进程所属进程组
processCB
->
processStatus
|=
OS_PROCESS_FLAG_GROUP_LEADER
;
//进程状态贴上当老大的标签
if
(
g_processGroup
!=
NULL
)
{
//全局进程组链表判空,g_processGroup指向"Kernel"进程所在组,详见: OsKernelInitProcess
LOS_ListTailInsert
(
&
g_processGroup
->
groupList
,
&
group
->
groupList
);
//把进程组挂到全局进程组链表上
}
return
group
;
}
STATIC
VOID
OsExitProcessGroup
(
LosProcessCB
*
processCB
,
ProcessGroup
**
group
)
//退出进程组,参数是进程地址和进程组地址的地址
STATIC
VOID
OsExitProcessGroup
(
LosProcessCB
*
processCB
,
ProcessGroup
**
group
)
//ProcessGroup *g_processGroup = NULL
{
LosProcessCB
*
groupProcessCB
=
OS_PCB_FROM_PID
(
processCB
->
group
->
groupID
);
LosProcessCB
*
groupProcessCB
=
OS_PCB_FROM_PID
(
processCB
->
group
->
groupID
);
//找到进程组老大进程的实体
LOS_ListDelete
(
&
processCB
->
subordinateGroupList
);
if
(
LOS_ListEmpty
(
&
processCB
->
group
->
processList
)
&&
LOS_ListEmpty
(
&
processCB
->
group
->
exitProcessList
))
{
LOS_ListDelete
(
&
processCB
->
group
->
groupList
);
groupProcessCB
->
processStatus
&=
~
OS_PROCESS_FLAG_GROUP_LEADER
;
*
group
=
processCB
->
group
;
if
(
OsProcessIsUnused
(
groupProcessCB
)
&&
!
(
groupProcessCB
->
processStatus
&
OS_PROCESS_FLAG_EXIT
))
{
LOS_ListDelete
(
&
groupProcessCB
->
pendList
);
OsInsertPCBToFreeList
(
groupProcessCB
);
LOS_ListDelete
(
&
processCB
->
subordinateGroupList
);
//从进程组进程链表上摘出去
if
(
LOS_ListEmpty
(
&
processCB
->
group
->
processList
)
&&
LOS_ListEmpty
(
&
processCB
->
group
->
exitProcessList
))
{
//进程组进程链表和退出进程链表都为空时
LOS_ListDelete
(
&
processCB
->
group
->
groupList
);
//从全局进程组链表上把自己摘出去 记住它是 LOS_ListTailInsert(&g_processGroup->groupList, &group->groupList) 挂上去的
groupProcessCB
->
processStatus
&=
~
OS_PROCESS_FLAG_GROUP_LEADER
;
//贴上不是组长的标签
*
group
=
processCB
->
group
;
//????? 这步操作没看明白,谁能告诉我为何要这么做?
if
(
OsProcessIsUnused
(
groupProcessCB
)
&&
!
(
groupProcessCB
->
processStatus
&
OS_PROCESS_FLAG_EXIT
))
{
//组长进程时退出的标签
LOS_ListDelete
(
&
groupProcessCB
->
pendList
);
//进程从全局进程链表上摘除
OsInsertPCBToFreeList
(
groupProcessCB
);
//释放进程的资源,回到freelist再利用
}
}
processCB
->
group
=
NULL
;
}
//通过组ID找个进程组
STATIC
ProcessGroup
*
OsFindProcessGroup
(
UINT32
gid
)
{
ProcessGroup
*
group
=
NULL
;
...
...
@@ -460,16 +460,16 @@ STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB)
(
VOID
)
LOS_MemFree
(
m_aucSysMem1
,
group
);
}
}
//进程的自然退出,参数是当前运行的任务
STATIC
VOID
OsProcessNaturalExit
(
LosTaskCB
*
runTask
,
UINT32
status
)
{
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
runTask
->
processID
);
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
runTask
->
processID
);
//通过task找到所属PCB
LosProcessCB
*
parentCB
=
NULL
;
LOS_ASSERT
(
!
(
processCB
->
threadScheduleMap
!=
0
));
LOS_ASSERT
(
processCB
->
processStatus
&
OS_PROCESS_STATUS_RUNNING
);
LOS_ASSERT
(
!
(
processCB
->
threadScheduleMap
!=
0
));
//断言没有任务需要调度了,当前task是最后一个了
LOS_ASSERT
(
processCB
->
processStatus
&
OS_PROCESS_STATUS_RUNNING
);
//断言必须为正在运行的进程
OsChildProcessResourcesFree
(
processCB
);
OsChildProcessResourcesFree
(
processCB
);
//
#ifdef LOSCFG_KERNEL_CPUP
OsCpupClean
(
processCB
->
processID
);
...
...
@@ -731,12 +731,12 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, U
}
(
VOID
)
memset_s
(
ttb
,
PAGE_SIZE
,
0
,
PAGE_SIZE
);
retVal
=
OsUserVmSpaceInit
(
space
,
ttb
);
//初始化虚拟空间和本进程 mmu
vmPage
=
OsVmVaddrToPage
(
ttb
);
if
((
retVal
==
FALSE
)
||
(
vmPage
==
NULL
))
{
vmPage
=
OsVmVaddrToPage
(
ttb
);
//通过虚拟地址拿到page
if
((
retVal
==
FALSE
)
||
(
vmPage
==
NULL
))
{
//异常处理
PRINT_ERR
(
"create space failed! ret: %d, vmPage: %#x
\n
"
,
retVal
,
vmPage
);
processCB
->
processStatus
=
OS_PROCESS_FLAG_UNUSED
;
(
VOID
)
LOS_MemFree
(
m_aucSysMem0
,
space
);
LOS_PhysPagesFreeContiguous
(
ttb
,
1
);
processCB
->
processStatus
=
OS_PROCESS_FLAG_UNUSED
;
//进程未使用,干净
(
VOID
)
LOS_MemFree
(
m_aucSysMem0
,
space
);
//释放虚拟空间
LOS_PhysPagesFreeContiguous
(
ttb
,
1
);
//释放物理页,4K
return
LOS_EAGAIN
;
}
processCB
->
vmSpace
=
space
;
...
...
@@ -900,7 +900,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsKernelInitProcess(VOID)
}
processCB
->
processStatus
&=
~
OS_PROCESS_STATUS_INIT
;
// 进程初始化位 置1
g_processGroup
=
processCB
->
group
;
//进程组
g_processGroup
=
processCB
->
group
;
//
全局进程组指向了KProcess所在的
进程组
LOS_ListInit
(
&
g_processGroup
->
groupList
);
// 进程组链表初始化
OsCurrProcessSet
(
processCB
);
// 设置为当前进程
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录