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

优化进程模块部分注解

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    博客输出站点(国内):http://weharmonyos.com
    博客输出站点(国外):https://weharmony.github.io
    注解文件系统:https://gitee.com/weharmony/third_party_NuttX
    注解协议栈:https://gitee.com/weharmony/third_party_lwip
    注解编译子系统:https://gitee.com/weharmony/build_lite
上级 a7674cf6
......@@ -5,11 +5,10 @@
v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
前因后果相关篇为:
* [v08.03 鸿蒙内核源码分析(总目录) | 百万汉字注解 百篇博客分析](https://my.oschina.net/weharmony/blog/4626852)
* [v09.04 鸿蒙内核源码分析(调度故事) | 用故事说内核调度过程](https://my.oschina.net/weharmony/blog/4634668)
* [v09.04 鸿蒙内核源码分析(调度故事) | 用故事说内核调度](https://my.oschina.net/weharmony/blog/4634668)
* [v10.03 鸿蒙内核源码分析(内存主奴) | 皇上和奴才如何相处](https://my.oschina.net/weharmony/blog/4646802)
* [v13.05 鸿蒙内核源码分析(源码注释) | 每天死磕一点点](https://my.oschina.net/weharmony/blog/4686747)
* [v18.02 鸿蒙内核源码分析(源码结构) | 内核文件各自含义](https://my.oschina.net/weharmony/blog/4869137)
......@@ -17,7 +16,6 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
#### 几点说明
**中文注解鸿蒙内核 | [kernel_liteos_a_note](https://gitee.com/weharmony/kernel_liteos_a_note)**
是在 `OpenHarmony`[kernel_liteos_a](https://gitee.com/openharmony/kernel_liteos_a) 基础上给内核源码加上中文注解的版本.与官方源码按月保持同步,同步历史如下:
......@@ -38,10 +36,10 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
分成三部分内容
* [OpenHarmony开发者文档](http://weharmonyos.com/openharmony) 是对官方文档 [docs](https://gitee.com/openharmony/docs) 做的非常炫酷的静态站点,支持侧边栏/面包屑/搜索/中英文,非常方便的查看官方文档,大大提高学习和开发效率
* [百篇博客分析鸿蒙内核](http://weharmonyos.com/weharmony) 是对内核源码注解过程中整理出来的内容输出.
* 整理的一些分析内核的工具和书籍 如: [鸿蒙源码分析.离线文档](http://weharmonyos.com/history.html) , [GNU汇编](http://weharmonyos.com/book/assembly.html), [gn参考手册](http://weharmonyos.com/gn/docs/)
* [鸿蒙内核源码分析](http://weharmonyos.com/weharmony) 是对内核源码注解过程中整理出来的`100`篇博客输出.
* 分析内核的工具和书籍 如: [鸿蒙源码分析.离线文档](http://weharmonyos.com/history.html) , [GNU汇编](http://weharmonyos.com/book/assembly.html), [gn参考手册](http://weharmonyos.com/gn/docs/)
**子系统注解仓库**
**注解子系统仓库**
在给鸿蒙内核源码加注过程中发现仅仅注解内核仓库还不够,因为它关联了其他子系统,若对这些子系统不了解是很难完整的注解鸿蒙内核,所以也对这些关联仓库进行了部分注解,这些仓库包括:
......@@ -49,8 +47,6 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
* [协议栈 | lwip](https://gitee.com/weharmony/third_party_lwip)
* [文件系统 | NuttX](https://gitee.com/weharmony/third_party_NuttX)
* [标准库 | musl](https://gitee.com/weharmony/third_party_musl)
#### 为何要精读内核源码?
* 码农的学职生涯,都应精读一遍内核源码。以浇筑好计算机知识大厦的地基,地基纵深的坚固程度,很大程度能决定未来大厦能盖多高。那为何一定要精读细品呢?
......@@ -87,6 +83,7 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
- [x] 搜索 `@note_why` 是尚未看明白的地方,有看明白的,请Pull Request完善
- [x] 搜索 `@note_thinking` 是一些的思考和建议
- [x] 搜索 `@note_#if0` 是由第三方项目提供不在内核源码中定义的极为重要结构体,为方便理解而添加的。
- [x] 搜索 `@note_link` 是网址链接,方便理解模块信息,来源于官方文档,百篇博客,外部链接
- [x] 搜索 `@note_good` 是给源码点赞的地方
#### 目录结构
......@@ -132,7 +129,6 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
# 它与内核代码无关,大家可以忽略它,取名zzz是为了排在最后,减少对原有代码目录级的侵入,
# zzz 的想法源于微信中名称为AAA的那帮朋友,你的微信里应该也有他们熟悉的身影吧 :|P
```
#### **百篇博客分析.深挖内核地基**
* 给鸿蒙内核源码加注释过程中,整理出以下文章。内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感,容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思。更希望让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了。 😛
* 与代码有bug需不断debug一样,文章和注解内容会存在不少错漏之处,请多包涵,但会反复修正,持续更新,v**.xx 代表文章序号和修改的次数,精雕细琢,言简意赅,力求打造精品内容。
......@@ -141,13 +137,13 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
* [v01.12 鸿蒙内核源码分析(双向链表) | 谁是内核最重要结构体](https://my.oschina.net/weharmony/blog/4572304)
* [v02.06 鸿蒙内核源码分析(进程管理) | 谁在管理内核资源](https://my.oschina.net/weharmony/blog/4574429)
* [v03.06 鸿蒙内核源码分析(时钟任务) | 触发调度谁的贡献最大](https://my.oschina.net/weharmony/blog/4574493)
* [v03.06 鸿蒙内核源码分析(时钟任务) | 调度的源动力从哪来](https://my.oschina.net/weharmony/blog/4574493)
* [v04.03 鸿蒙内核源码分析(任务调度) | 内核调度的单元是谁](https://my.oschina.net/weharmony/blog/4595539)
* [v05.05 鸿蒙内核源码分析(任务管理) | 任务池是如何管理的](https://my.oschina.net/weharmony/blog/4603919)
* [v06.03 鸿蒙内核源码分析(调度队列) | 内核调度需要排队](https://my.oschina.net/weharmony/blog/4606916)
* [v05.05 鸿蒙内核源码分析(任务管理) | 如何管理任务池](https://my.oschina.net/weharmony/blog/4603919)
* [v06.03 鸿蒙内核源码分析(调度队列) | 内核调度需要排队](https://my.oschina.net/weharmony/blog/4606916)
* [v07.08 鸿蒙内核源码分析(调度机制) | 任务是如何被调度执行的](https://my.oschina.net/weharmony/blog/4623040)
* [v08.03 鸿蒙内核源码分析(总目录) | 百万汉字注解 百篇博客分析](https://my.oschina.net/weharmony/blog/4626852)
* [v09.04 鸿蒙内核源码分析(调度故事) | 用故事说内核调度过程](https://my.oschina.net/weharmony/blog/4634668)
* [v09.04 鸿蒙内核源码分析(调度故事) | 用故事说内核调度](https://my.oschina.net/weharmony/blog/4634668)
* [v10.03 鸿蒙内核源码分析(内存主奴) | 皇上和奴才如何相处](https://my.oschina.net/weharmony/blog/4646802)
* [v11.03 鸿蒙内核源码分析(内存分配) | 内存有哪些分配方式](https://my.oschina.net/weharmony/blog/4646802)
* [v12.04 鸿蒙内核源码分析(内存管理) | 虚拟内存全景图是怎样的](https://my.oschina.net/weharmony/blog/4652284)
......@@ -162,30 +158,30 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
* [v21.07 鸿蒙内核源码分析(线程概念) | 是谁在不断的折腾CPU](https://my.oschina.net/weharmony/blog/4915543)
* [v22.03 鸿蒙内核源码分析(汇编基础) | CPU上班也要打卡](https://my.oschina.net/weharmony/blog/4920361)
* [v23.04 鸿蒙内核源码分析(汇编传参) | 如何传递复杂的参数](https://my.oschina.net/weharmony/blog/4927892)
* [v24.03 鸿蒙内核源码分析(进程概念) | 怎么更好的理解进程](https://my.oschina.net/weharmony/blog/4937521)
* [v24.03 鸿蒙内核源码分析(进程概念) | 如何更好的理解进程](https://my.oschina.net/weharmony/blog/4937521)
* [v25.05 鸿蒙内核源码分析(并发并行) | 听过无数遍的两个概念](https://my.oschina.net/weharmony/blog/4940329)
* [v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志](https://my.oschina.net/weharmony/blog/4944129)
* [v27.05 鸿蒙内核源码分析(互斥锁) | 比自旋锁丰满的互斥锁](https://my.oschina.net/weharmony/blog/4945465)
* [v27.05 鸿蒙内核源码分析(互斥锁) | 同样是锁它确更丰满](https://my.oschina.net/weharmony/blog/4945465)
* [v28.04 鸿蒙内核源码分析(进程通讯) | 九种进程间通讯方式速揽](https://my.oschina.net/weharmony/blog/4947398)
* [v29.05 鸿蒙内核源码分析(信号量) | 谁在解决任务间的同步](https://my.oschina.net/weharmony/blog/4949720)
* [v30.07 鸿蒙内核源码分析(事件控制) | 任务间多对多的同步方案](https://my.oschina.net/weharmony/blog/4950956)
* [v31.02 鸿蒙内核源码分析(定时器) | 内核优先级最高任务是它](https://my.oschina.net/weharmony/blog/4951625)
* [v30.07 鸿蒙内核源码分析(事件控制) | 多对多任务如何同步](https://my.oschina.net/weharmony/blog/4950956)
* [v31.02 鸿蒙内核源码分析(定时器) | 内核最高级任务竟是它](https://my.oschina.net/weharmony/blog/4951625)
* [v32.03 鸿蒙内核源码分析(CPU) | 整个内核是一个死循环](https://my.oschina.net/weharmony/blog/4952034)
* [v33.03 鸿蒙内核源码分析(消息队列) | 进程间如何异步传递大数据](https://my.oschina.net/weharmony/blog/4952961)
* [v34.04 鸿蒙内核源码分析(原子操作) | 谁在为完整性保驾护航](https://my.oschina.net/weharmony/blog/4955290)
* [v35.03 鸿蒙内核源码分析(时间管理) | 内核基本时间单位是哪位](https://my.oschina.net/weharmony/blog/4956163)
* [v36.05 鸿蒙内核源码分析(工作模式) | 它是程序界的韦小宝](https://my.oschina.net/weharmony/blog/4965052)
* [v35.03 鸿蒙内核源码分析(时间管理) | 内核基本时间单位是](https://my.oschina.net/weharmony/blog/4956163)
* [v36.05 鸿蒙内核源码分析(工作模式) | 程序界的韦小宝是谁](https://my.oschina.net/weharmony/blog/4965052)
* [v37.06 鸿蒙内核源码分析(系统调用) | 开发者永远的口头禅](https://my.oschina.net/weharmony/blog/4967613)
* [v38.06 鸿蒙内核源码分析(寄存器) | 全宇宙就只佩服它](https://my.oschina.net/weharmony/blog/4969487)
* [v38.06 鸿蒙内核源码分析(寄存器) | 讲真 全宇宙只佩服它](https://my.oschina.net/weharmony/blog/4969487)
* [v39.06 鸿蒙内核源码分析(异常接管) | 社会很单纯 复杂的是人](https://my.oschina.net/weharmony/blog/4973016)
* [v40.03 鸿蒙内核源码分析(汇编汇总) | 汇编可爱如邻家女孩](https://my.oschina.net/weharmony/blog/4977924)
* [v41.03 鸿蒙内核源码分析(任务切换) | 看汇编如何切换任务](https://my.oschina.net/weharmony/blog/4988628)
* [v42.05 鸿蒙内核源码分析(中断切换) | 系统因中断活力四射](https://my.oschina.net/weharmony/blog/4990948)
* [v43.05 鸿蒙内核源码分析(中断概念) | 海公公的日常工作](https://my.oschina.net/weharmony/blog/4992750)
* [v44.04 鸿蒙内核源码分析(中断管理) | 江湖从此不再怕中断](https://my.oschina.net/weharmony/blog/4995800)
* [v44.04 鸿蒙内核源码分析(中断管理) | 没中断太可怕](https://my.oschina.net/weharmony/blog/4995800)
* [v45.05 鸿蒙内核源码分析(Fork) | 一次调用 两次返回](https://my.oschina.net/weharmony/blog/5010301)
* [v46.05 鸿蒙内核源码分析(特殊进程) | 老鼠生儿会打洞](https://my.oschina.net/weharmony/blog/5014444)
* [v47.02 鸿蒙内核源码分析(进程回收) | 临终向老祖宗托孤](https://my.oschina.net/weharmony/blog/5017716)
* [v47.02 鸿蒙内核源码分析(进程回收) | 临终托孤的短命娃](https://my.oschina.net/weharmony/blog/5017716)
* [v48.05 鸿蒙内核源码分析(信号生产) | 年过半百 活力十足](https://my.oschina.net/weharmony/blog/5022149)
* [v49.03 鸿蒙内核源码分析(信号消费) | 谁让CPU连续四次换栈运行](https://my.oschina.net/weharmony/blog/5027224)
* [v50.03 鸿蒙内核源码分析(编译环境) | 编译鸿蒙防掉坑指南](https://my.oschina.net/weharmony/blog/5028613)
......@@ -193,19 +189,19 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
* [v52.05 鸿蒙内核源码分析(静态站点) | 五一哪也没去在干这事](https://my.oschina.net/weharmony/blog/5042657)
* [v53.03 鸿蒙内核源码分析(ELF解析) | 敢忘了她姐俩你就不是银](https://my.oschina.net/weharmony/blog/5048746)
* [v54.04 鸿蒙内核源码分析(静态链接) | 一个小项目看中间过程](https://my.oschina.net/weharmony/blog/5049918)
* [v55.04 鸿蒙内核源码分析(重定位) | 与国际接轨的对外发言人](https://my.oschina.net/weharmony/blog/5055124)
* [v55.04 鸿蒙内核源码分析(重定位) | 与国际接轨的对外发言人](https://my.oschina.net/weharmony/blog/5055124)
* [v56.05 鸿蒙内核源码分析(进程映像) | 程序是如何被加载运行的](https://my.oschina.net/weharmony/blog/5060359)
* [v57.02 鸿蒙内核源码分析(编译过程) | 简单案例窥视中间过程](https://my.oschina.net/weharmony/blog/5064209)
* [v58.03 鸿蒙内核源码分析(环境脚本) | 编译鸿蒙原来如此简单](https://my.oschina.net/weharmony/blog/5132725)
* [v57.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程](https://my.oschina.net/weharmony/blog/5064209)
* [v58.03 鸿蒙内核源码分析(环境脚本) | 编译鸿蒙原来简单](https://my.oschina.net/weharmony/blog/5132725)
* [v59.04 鸿蒙内核源码分析(构建工具) | 顺瓜摸藤调试构建过程](https://my.oschina.net/weharmony/blog/5135157)
* [v60.04 鸿蒙内核源码分析(gn应用) | 鸿蒙用什么工具构建](https://my.oschina.net/weharmony/blog/5137565)
* [v60.04 鸿蒙内核源码分析(gn应用) | 如何构建鸿蒙系统](https://my.oschina.net/weharmony/blog/5137565)
* [v61.03 鸿蒙内核源码分析(忍者ninja) | 忍者的特点就是一个字](https://my.oschina.net/weharmony/blog/5139034)
* [v62.02 鸿蒙内核源码分析(文件概念) | 为什么说一切皆是文件](https://my.oschina.net/weharmony/blog/5152858)
* [v63.04 鸿蒙内核源码分析(文件系统) | 用图书管理说文件系统](https://my.oschina.net/weharmony/blog/5165752)
* [v64.06 鸿蒙内核源码分析(索引节点) | 谁是文件系统最重要的概念](https://my.oschina.net/weharmony/blog/5168716)
* [v65.05 鸿蒙内核源码分析(挂载目录) | 为何文件系统需要挂载](https://my.oschina.net/weharmony/blog/5172566)
* [v66.07 鸿蒙内核源码分析(根文件系统) | 谁先挂到/谁就是...](https://my.oschina.net/weharmony/blog/5177087)
* [v67.03 鸿蒙内核源码分析(字符设备) | 绝大多数设备都是...](https://my.oschina.net/weharmony/blog/5200946)
* [v66.07 鸿蒙内核源码分析(根文件系统) | 谁先挂到/谁就是根总](https://my.oschina.net/weharmony/blog/5177087)
* [v67.03 鸿蒙内核源码分析(字符设备) | 绝大多数设备都是这类](https://my.oschina.net/weharmony/blog/5200946)
* [v68.02 鸿蒙内核源码分析(VFS) | 文件系统是个大家庭](https://my.oschina.net/weharmony/blog/5211662)
* [v69.04 鸿蒙内核源码分析(文件句柄) | 你为什么叫句柄](https://my.oschina.net/weharmony/blog/5253251)
* [v70.05 鸿蒙内核源码分析(管道文件) | 如何降低数据流动成本](https://my.oschina.net/weharmony/blog/5258434)
......@@ -227,8 +223,9 @@ v13.xx 鸿蒙内核源码分析(源码注释篇) | 每天死磕一点点
[![WeHarmony/kernel_liteos_a_note](https://gitee.com/weharmony/kernel_liteos_a_note/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/weharmony/kernel_liteos_a_note)
鸿蒙研究站( weharmonyos ) | 每天死磕一点点,原创不易,欢迎转载,请注明出处。若能支持点赞更好,感谢每一份支持。
#### **关注不迷路.代码即人生**
![鸿蒙内核源码分析](https://gitee.com/weharmony/docs/raw/master/pic/other/so1so.png)
**QQ群 790015635 | 入群密码 666**
鸿蒙研究站( weharmonyos ) | 每天死磕一点点,原创不易,欢迎转载,请注明出处。若能支持点赞则更佳,感谢每一份支持。
\ No newline at end of file
......@@ -645,7 +645,7 @@ STATIC UINT32 OsMapL2PageContinous(PTE_T pte1, UINT32 flags, VADDR_T *vaddr, PAD
*count -= saveCounts;
return saveCounts;
}
//所谓的 map 就是 生成L1,L2页表项的过程
//mmu映射,所谓的map就是生成L1,L2页表项的过程
status_t LOS_ArchMmuMap(LosArchMmu *archMmu, VADDR_T vaddr, PADDR_T paddr, size_t count, UINT32 flags)
{
PTE_T l1Entry;
......
......@@ -125,7 +125,7 @@ STATIC VOID OsExitProcessGroup(LosProcessCB *processCB, ProcessGroup **group)//P
processCB->group = NULL;
}
//通过组ID找到进程组
//通过指定组ID找到进程组
STATIC ProcessGroup *OsFindProcessGroup(UINT32 gid)
{
ProcessGroup *group = NULL;
......@@ -142,7 +142,7 @@ STATIC ProcessGroup *OsFindProcessGroup(UINT32 gid)
PRINT_INFO("%s is find group : %u failed!\n", __FUNCTION__, gid);
return NULL;
}
//给指定进程组发送信号
STATIC INT32 OsSendSignalToSpecifyProcessGroup(ProcessGroup *group, siginfo_t *info, INT32 permission)
{
INT32 ret, success, err;
......@@ -150,30 +150,30 @@ STATIC INT32 OsSendSignalToSpecifyProcessGroup(ProcessGroup *group, siginfo_t *i
success = 0;
ret = -LOS_ESRCH;
LOS_DL_LIST_FOR_EACH_ENTRY(childCB, &(group->processList), LosProcessCB, subordinateGroupList) {
if (childCB->processID == 0) {
LOS_DL_LIST_FOR_EACH_ENTRY(childCB, &(group->processList), LosProcessCB, subordinateGroupList) {//遍历进程组内的进程
if (childCB->processID == 0) {//0号进程为KIdle进程,是让CPU休息的进程,不处理信号
continue;
}
err = OsDispatch(childCB->processID, info, permission);
err = OsDispatch(childCB->processID, info, permission);//给进程发送信号
success |= !err;
ret = err;
}
/* At least one success. */
return success ? LOS_OK : ret;
}
//给所有进程发送指定信号
LITE_OS_SEC_TEXT INT32 OsSendSignalToAllProcess(siginfo_t *info, INT32 permission)
{
INT32 ret, success, err;
ProcessGroup *group = NULL;
success = 0;
err = OsSendSignalToSpecifyProcessGroup(g_processGroup, info, permission);
err = OsSendSignalToSpecifyProcessGroup(g_processGroup, info, permission);//给g_processGroup进程组发送信号
success |= !err;
ret = err;
/* all processes group */
LOS_DL_LIST_FOR_EACH_ENTRY(group, &g_processGroup->groupList, ProcessGroup, groupList) {
LOS_DL_LIST_FOR_EACH_ENTRY(group, &g_processGroup->groupList, ProcessGroup, groupList) {//遍历进程组
/* all processes in the process group. */
err = OsSendSignalToSpecifyProcessGroup(group, info, permission);
success |= !err;
......@@ -181,7 +181,7 @@ LITE_OS_SEC_TEXT INT32 OsSendSignalToAllProcess(siginfo_t *info, INT32 permissio
}
return success ? LOS_OK : ret;
}
//发送指定信号给给进程组
LITE_OS_SEC_TEXT INT32 OsSendSignalToProcessGroup(INT32 pid, siginfo_t *info, INT32 permission)
{
ProcessGroup *group = NULL;
......@@ -228,7 +228,7 @@ ERR:
PRINT_INFO("%s is find the child : %d failed in parent : %u\n", __FUNCTION__, childPid, processCB->processID);
return LOS_NOK;
}
//找出指定进程的指定孩子进程
STATIC LosProcessCB *OsFindExitChildProcess(const LosProcessCB *processCB, INT32 childPid)
{
LosProcessCB *exitChild = NULL;
......@@ -347,22 +347,22 @@ STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosPro
//回收指定进程的资源
LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
{
if (!(processCB->processStatus & (OS_PROCESS_STATUS_INIT | OS_PROCESS_STATUS_RUNNING))) {//1.初始化阶段并没有使用到资源,所以不用回收
PRINT_ERR("The process(%d) has no permission to release process(%d) resources!\n",//2.正在运行的进程不能回收
if (!(processCB->processStatus & (OS_PROCESS_STATUS_INIT | OS_PROCESS_STATUS_RUNNING))) {//初始化和正在运行的进程,不用/能回收
PRINT_ERR("The process(%d) has no permission to release process(%d) resources!\n",// @note_thinking 此处应该直接 return回去吧 !
OsCurrProcessGet()->processID, processCB->processID);
}
#ifdef LOSCFG_FS_VFS
if (OsProcessIsUserMode(processCB)) {//用户进程
delete_files(processCB->files);
delete_files(processCB->files);//归还进程占用的进程描述符`profd`,如果是最后一个占用的系统描述符的进程,则同时归还系统文件描述符`sysfd`
}
processCB->files = NULL;
processCB->files = NULL; //重置指针为空
#endif
#ifdef LOSCFG_SECURITY_CAPABILITY //安全开关
if (processCB->user != NULL) {
(VOID)LOS_MemFree(m_aucSysMem1, processCB->user);//删除用户
processCB->user = NULL;
processCB->user = NULL; //重置指针为空
}
#endif
......@@ -377,7 +377,7 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
#endif
#ifdef LOSCFG_KERNEL_LITEIPC
if (OsProcessIsUserMode(processCB)) {//用户进程
if (OsProcessIsUserMode(processCB)) {//当为用户进程
LiteIpcPoolDelete(&(processCB->ipcInfo));//删除进程对lite IPC的开销
(VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo));
}
......@@ -435,16 +435,16 @@ STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
return;
}
//孩子进程资源释放
//回收指定进程的已经退出(死亡)的孩子进程所占资源
STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB)
{
LosProcessCB *childCB = NULL;
ProcessGroup *group = NULL;
while (!LOS_ListEmpty(&((LosProcessCB *)processCB)->exitChildList)) {//
childCB = LOS_DL_LIST_ENTRY(processCB->exitChildList.pstNext, LosProcessCB, siblingList);
OsRecycleZombiesProcess(childCB, &group);
(VOID)LOS_MemFree(m_aucSysMem1, group);
while (!LOS_ListEmpty(&((LosProcessCB *)processCB)->exitChildList)) {//遍历直到没有了退出(死亡)的孩子进程
childCB = LOS_DL_LIST_ENTRY(processCB->exitChildList.pstNext, LosProcessCB, siblingList);//获取孩子进程,
OsRecycleZombiesProcess(childCB, &group);//其中会将childCB从exitChildList链表上摘出去
(VOID)LOS_MemFree(m_aucSysMem1, group);//
}
}
//一个进程的自然消亡过程,参数是当前运行的任务
......@@ -635,7 +635,7 @@ UINT32 OsSetProcessName(LosProcessCB *processCB, const CHAR *name)
}
return LOS_OK;
}
//初始化PCB
//初始化PCB(进程控制块)
STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, const CHAR *name)
{
processCB->processMode = mode; //用户态进程还是内核态进程
......@@ -651,16 +651,16 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, c
LOS_ListInit(&processCB->exitChildList); //初始化记录退出孩子进程链表,上面挂的是哪些exit 见于 OsProcessNaturalExit LOS_ListTailInsert(&parentCB->exitChildList, &processCB->siblingList);
LOS_ListInit(&(processCB->waitList)); //初始化等待任务链表 上面挂的是处于等待的 见于 OsWaitInsertWaitLIstInOrder LOS_ListHeadInsert(&processCB->waitList, &runTask->pendList);
#ifdef LOSCFG_KERNEL_VM
if (OsProcessIsUserMode(processCB)) {
processCB->vmSpace = OsCreateUserVmSpace();
#ifdef LOSCFG_KERNEL_VM
if (OsProcessIsUserMode(processCB)) {//如果是用户态进程
processCB->vmSpace = OsCreateUserVmSpace();//创建用户空间
if (processCB->vmSpace == NULL) {
processCB->processStatus = OS_PROCESS_FLAG_UNUSED;
return LOS_ENOMEM;
}
} else {
processCB->vmSpace = LOS_GetKVmSpace();
}
processCB->vmSpace = LOS_GetKVmSpace();//从这里也可以看出,所有内核态进程是共享一个进程空间的
}//在鸿蒙内核态进程只有kprocess 和 kidle 两个
#endif
#ifdef LOSCFG_SECURITY_VID
......@@ -670,7 +670,7 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, c
}
#endif
#ifdef LOSCFG_SECURITY_CAPABILITY
OsInitCapability(processCB);
OsInitCapability(processCB);//初始化进程安全相关功能
#endif
if (OsSetProcessName(processCB, name) != LOS_OK) {
......@@ -716,7 +716,7 @@ LITE_OS_SEC_TEXT BOOL LOS_CheckInGroups(UINT32 gid)
return FALSE;
}
#endif
//获取当前进程的用户ID
LITE_OS_SEC_TEXT INT32 LOS_GetUserID(VOID)
{
#ifdef LOSCFG_SECURITY_CAPABILITY
......@@ -731,7 +731,7 @@ LITE_OS_SEC_TEXT INT32 LOS_GetUserID(VOID)
return 0;
#endif
}
//获取当前进程的用户组ID
LITE_OS_SEC_TEXT INT32 LOS_GetGroupID(VOID)
{
#ifdef LOSCFG_SECURITY_CAPABILITY
......@@ -751,7 +751,7 @@ LITE_OS_SEC_TEXT INT32 LOS_GetGroupID(VOID)
STATIC UINT32 OsProcessCreateInit(LosProcessCB *processCB, UINT32 flags, const CHAR *name, UINT16 priority)
{
ProcessGroup *group = NULL;
UINT32 ret = OsInitPCB(processCB, flags, priority, name);
UINT32 ret = OsInitPCB(processCB, flags, priority, name);//初始化进程控制块
if (ret != LOS_OK) {
goto EXIT;
}
......@@ -921,12 +921,12 @@ EXIT:
SCHEDULER_UNLOCK(intSave);//还锁
return -ret;
}
//设置进程调度方式
//设置指定进程的调度参数,包括优先级和调度策略
LITE_OS_SEC_TEXT INT32 LOS_SetProcessScheduler(INT32 pid, UINT16 policy, UINT16 prio)
{
return OsSetProcessScheduler(LOS_PRIO_PROCESS, pid, prio, policy);
}
//获得进程调度方式
//获得指定进程的调度策略
LITE_OS_SEC_TEXT INT32 LOS_GetProcessScheduler(INT32 pid)
{
UINT32 intSave;
......@@ -980,7 +980,7 @@ OUT:
SCHEDULER_UNLOCK(intSave);
return prio;
}
//接口封装 - 获取进程优先级
//接口封装 - 获取指定进程优先级
LITE_OS_SEC_TEXT INT32 LOS_GetProcessPriority(INT32 pid)
{
return OsGetProcessPriority(LOS_PRIO_PROCESS, pid);
......@@ -1160,8 +1160,8 @@ STATIC UINT32 OsWaitOptionsCheck(UINT32 options)
}
return LOS_OK;
}
//返回已经终止的子进程的进程ID号,并清除僵死进程。
}
//等待子进程结束并回收子进程,返回已经终止的子进程的进程ID号,并清除僵死进程。
STATIC INT32 OsWait(INT32 pid, USER INT32 *status, USER siginfo_t *info, UINT32 options, VOID *rusage)
{
(VOID)rusage;
......@@ -1995,12 +1995,12 @@ LITE_OS_SEC_TEXT struct fd_table_s *LOS_GetFdTable(UINT32 pid)
return files->fdt;
}
#endif
//获取当前进程的进程ID
LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
{
return OsCurrProcessGet()->processID;
}
//按指定状态退出指定进程
LITE_OS_SEC_TEXT VOID OsProcessExit(LosTaskCB *runTask, INT32 status)
{
UINT32 intSave;
......@@ -2013,7 +2013,7 @@ LITE_OS_SEC_TEXT VOID OsProcessExit(LosTaskCB *runTask, INT32 status)
OsProcessNaturalExit(runTask, status);//进程自然退出
SCHEDULER_UNLOCK(intSave);
}
//获取系统支持的最大进程数目
LITE_OS_SEC_TEXT UINT32 LOS_GetSystemProcessMaximum(VOID)
{
return g_processMaxNum;
......
......@@ -435,7 +435,7 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskID,
return LOS_ERRNO_TSK_STKSZ_TOO_LARGE;
}
if (initParam->uwStackSize == 0) {//运行栈空间不能为0
if (initParam->uwStackSize == 0) {//任何任务都必须由内核态栈,所以uwStackSize不能为0
initParam->uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
}
initParam->uwStackSize = (UINT32)ALIGN(initParam->uwStackSize, LOSCFG_STACK_POINT_ALIGN_SIZE);
......@@ -446,7 +446,7 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskID,
return LOS_OK;
}
//任务栈(内核态)内存分配,由内核态进程空间提供,即 KProcess 的进程空间
LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskStackAlloc(VOID **topStack, UINT32 stackSize, VOID *pool)
{
*topStack = (VOID *)LOS_MemAllocAlign(pool, stackSize, LOSCFG_STACK_POINT_ALIGN_SIZE);
......
......@@ -69,10 +69,10 @@ typedef struct { //用户描述体
#endif
typedef struct {
UINT32 groupID; /**< Process group ID is the PID of the process that created the group */
LOS_DL_LIST processList; /**< List of processes under this process group */
LOS_DL_LIST exitProcessList; /**< List of closed processes (zombie processes) under this group */
LOS_DL_LIST groupList; /**< Process group list */
UINT32 groupID; /**< Process group ID is the PID of the process that created the group *///进程组ID是创建进程组的那个进程的ID
LOS_DL_LIST processList; /**< List of processes under this process group *///属于该进程组的进程链表
LOS_DL_LIST exitProcessList; /**< List of closed processes (zombie processes) under this group *///进程组的僵死进程链表
LOS_DL_LIST groupList; /**< Process group list *///进程组链表,上面挂的都是进程组
} ProcessGroup;
typedef struct ProcessCB {
......@@ -117,15 +117,15 @@ typedef struct ProcessCB {
User *user; //进程的拥有者
UINT32 capability; //安全能力范围 对应 CAP_SETGID
#endif
#ifdef LOSCFG_SECURITY_VID
#ifdef LOSCFG_SECURITY_VID //虚拟ID映射功能
TimerIdMap timerIdMap;
#endif
#ifdef LOSCFG_DRIVERS_TZDRIVER
struct file *execFile; /**< Exec bin of the process */
struct file *execFile; /**< Exec bin of the process *///进程的可执行文件
#endif
mode_t umask;//umask(user file-creatiopn mode mask)为用户文件创建掩码,是创建文件或文件夹时默认权限的基础。
#ifdef LOSCFG_KERNEL_CPUP
OsCpupBase processCpup; /**< Process cpu usage */
OsCpupBase processCpup; /**< Process cpu usage *///进程占用CPU情况统计
#endif
struct rlimit pl_rlimit[RLIM_NLIMITS];
} LosProcessCB;
......@@ -311,7 +311,7 @@ STATIC INLINE BOOL OsProcessIsDead(const LosProcessCB *processCB)//查下进程
#define OS_KERNEL_MODE 0x0U //内核态
#define OS_USER_MODE 0x1U //用户态
STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)//用户模式进程
STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)//用户进程
{
return (processCB->processMode == OS_USER_MODE);
}
......
......@@ -75,10 +75,10 @@ UINT32 OsSysMemInit(VOID)
#ifdef LOSCFG_KERNEL_VM
OsVmPageStartup();// 物理内存初始化
g_kHeapInited = TRUE;
OsInitMappingStartUp();// 映射初始化
g_kHeapInited = TRUE; //内核堆区初始化完成
OsInitMappingStartUp();//映射初始化
#else
g_kHeapInited = TRUE;//堆区完成初始化
g_kHeapInited = TRUE;//内核堆区完成初始化
#endif
return LOS_OK;
}
......
......@@ -36,16 +36,27 @@
#include "los_vm_lock.h"
#include "los_vm_phys.h"
#include "los_process_pri.h"
/*
vdso 新型系统调用机制 ,虚拟动态共享库VDSO就是Virtual Dynamic Shared Object,
就是内核提供的虚拟的.so,这类.so文件不在磁盘上,而是包含在内核里面。内核把包含
某一.so的物理页在程序启动的时候映射入其进程的内存空间,对应的程序就可以当普通的.so来使用里头的函数
/**************************************************************************************
基本概念:
VDSO(Virtual Dynamic Shared Object,虚拟动态共享库)相对于普通的动态共享库,区别在于
其so文件不保存在文件系统中,存在于系统镜像中,由内核在运行时确定并提供给应用程序,故称为虚拟动态共享库。
OpenHarmony系统通过VDSO机制实现上层用户态程序可以快速读取内核相关数据的一种通道方法,
可用于实现部分系统调用的加速,也可用于实现非系统敏感数据(硬件配置、软件配置)的快速读取。
运行机制:
VDSO其核心思想就是内核看护一段内存,并将这段内存映射(只读)进用户态应用程序的地址空间,
应用程序通过链接vdso.so后,将某些系统调用替换为直接读取这段已映射的内存从而避免系统调用达到加速的效果。
VDSO总体可分为数据页与代码页两部分:
数据页提供内核映射给用户进程的内核时数据;
代码页提供屏蔽系统调用的主要逻辑;
@note_link http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-bundles-share.html
参考:http://lishiwen4.github.io/linux/vdso-and-syscall
https://vvl.me/2019/06/linux-syscall-and-vsyscall-vdso-in-x86/
#cat /proc/self/maps
*/
**************************************************************************************/
LITE_VDSO_DATAPAGE VdsoDataPage g_vdsoDataPage __attribute__((__used__));//使用这个数据区
STATIC size_t g_vdsoSize;
......
......@@ -43,23 +43,23 @@ extern "C" {
#ifdef LOSCFG_NET_TELNET
#define TELNET "/dev/telnet"
#define TELNET "/dev/telnet" //远程登录文件路径
#define FIFO_MAX 1024
#define FIFO_MAX 1024 //缓冲区大小
#define TELNET_IOC_MAGIC 't'
#define CFG_TELNET_SET_FD _IO(TELNET_IOC_MAGIC, 1)
#define CFG_TELNET_EVENT_PEND CONSOLE_CMD_RD_BLOCK_TELNET
#define BLOCK_DISABLE 0
#define BLOCK_ENABLE 1
//远程登录接发数据结构体.管理缓冲区
typedef struct {
UINT32 rxIndex; /* index for receiving user's commands */
UINT32 rxOutIndex; /* index for taking out commands by a shell task to run */
UINT32 fifoNum; /* unused size of the cmdBuf */
UINT32 lock;
UINT32 fifoNum; /* unused size of the cmdBuf *///剩余buf大小
UINT32 lock; //锁用于保证buf数据一致性
CHAR rxBuf[FIFO_MAX]; /* the real buffer to store user's commands */
} TELNTE_FIFO_S;
//远程登录设备结构体
typedef struct {
INT32 clientFd;
UINT32 id;
......
......@@ -32,7 +32,7 @@
#include "vid_type.h"
#include "vid_api.h"
#include "los_memory.h"
//虚拟ID映射链表初始化
UINT32 VidMapListInit(LosProcessCB *processCB)
{
memset_s(&processCB->timerIdMap, sizeof(TimerIdMap), 0, sizeof(TimerIdMap));
......@@ -53,7 +53,7 @@ UINT32 VidMapListInit(LosProcessCB *processCB)
}
return LOS_OK;
}
//销毁虚拟ID映射
void VidMapDestroy(LosProcessCB *processCB)
{
TimerIdMapNode *idNode = NULL;
......
git add -A
git commit -m ' readme 调整
git commit -m ' 优化进程模块部分注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
博客输出站点(国内):http://weharmonyos.com
博客输出站点(国外):https://weharmony.github.io
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册