完善之前的一些注解

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    https://my.oschina.net/weharmony
上级 500f93bb
......@@ -14,19 +14,19 @@
* 在每位码农的学职生涯,都应精读一遍内核源码.以浇筑好计算机知识大厦的地基,地基纵深的坚固程度,很大程度能决定了未来大厦能盖多高。为何一定要精读细品呢?
* 因为内核代码本身并不太多,都是浓缩的精华,精读是让各个知识点高频出现,不孤立成点状记忆,让各点相连成面,刻意练习,闪爆大脑,如此短时间内容易结成一张高浓度,高密度的底层网,不断训练大脑肌肉记忆,将这些地基信息从临时记忆区转移到永久记忆区。跟骑单车一样,一旦学会,即便多年不骑,照样跨上就走,游刃有余。
* 因为内核代码本身并不太多,都是浓缩的精华,精读是让各个知识点高频出现,不孤立成点状记忆,让各点相连成线,线线成面,刻意练习,闪爆大脑,如此短时间内容易结成一张高浓度,高密度的底层网,内核画面越描越清晰,越雕越深刻,不断训练大脑肌肉记忆,将记忆从临时区转移到永久区。跟骑单车一样,一旦学会,即便多年不骑,照样跨上就走,游刃有余。
### **热爱是所有的理由和答案**
* 因大学时阅读 `linux 2.6` 内核痛并快乐的经历,一直有个心愿,如何让更多对内核感兴趣的朋友减少阅读时间,加速对计算机系统级的理解,而不至于过早的放弃.但因过程种种,多年一直没有行动,基本要放弃这件事了. 恰逢 **2020/9/10** 鸿蒙正式开源,重新激活了多年的心愿,就有那么点一发不可收拾了.
***2021/3/10** 刚好半年, 对内核源码的注解已完成了 **70%** ,对内核源码的博客分析已完成了**40篇**, 每天都很充实,很兴奋,连做梦内核代码都在往脑海里鱼贯而入.如此疯狂地做一件事还是当年谈恋爱的时候, 只因热爱, 热爱是所有的理由和答案. :P
***2021/3/10** 刚好半年, 对内核源码的注解已完成了 **70%** ,对内核源码的博客分析已完成了**40篇**, 每天都很充实,很兴奋,连做梦内核代码都在往脑海里鱼贯而入.如此疯狂地做一件事还是当年谈恋爱的时候, 只因热爱, 热爱是所有的理由和答案. :P
### **(〃・ิ‿・ิ)ゞ鸿蒙内核开发者**
* 感谢开放原子开源基金会,致敬鸿蒙内核开发者提供了如此优秀的源码,一了多年的夙愿,津津乐道于此.精读内核源码当然是件很困难的事,时间上要以月甚至年为单位,但正因为很难才值得去做! 干困难事,必有所得. 专注聚焦,必有所获.
* 从内核一行行的代码中能深深感受到开发者各中艰辛与坚持,及鸿蒙生态对未来的价值,这些是张嘴就来的网络喷子们永远不能体会到的.可以毫不夸张的说鸿蒙内核源码可作为大学 **C语言**,**数据结构**,**操作系统**,**汇编语言**,**计算机组成原理** 五门课程的教学项目.如此宝库,不深入研究实在是暴殄天物,于心不忍,注者坚信鸿蒙大势所趋,未来可期,其坚定的追随者和传播者.
* 从内核一行行的代码中能深深感受到开发者各中艰辛与坚持,及鸿蒙生态对未来的价值,这些是张嘴就来的网络喷子们永远不能体会到的.可以毫不夸张的说鸿蒙内核源码可作为大学 **C语言**,**数据结构**,**操作系统**,**汇编语言**,**计算机组成原理** 五门课程的教学项目.如此宝库,不深入研究实在是暴殄天物,于心不忍,注者坚信鸿蒙大势所趋,未来可期,它必须成功,也必然成功,誓做其坚定的追随者和传播者.
### **加注方式是怎样的?**
......@@ -52,15 +52,17 @@
* **普通概念映射级:** 这一级不涉及专业知识,用大众所熟知的公共认知就能听明白是个什么概念,也就是说用一个普通人都懂的概念去诠释或者映射一个他们从没听过的概念.让陌生的知识点与大脑中烂熟于心的知识点建立多重链接,加深记忆.说别人能听得懂的话这很重要!!! 一个没学过计算机知识的卖菜大妈就不可能知道内核的基本运作了吗? 不一定!,在系列篇中试图用 **[鸿蒙内核源码分析(总目录)之故事篇](https://my.oschina.net/weharmony)** 去引导这一层级的认知,希望能卷入更多的人来关注基础软件,尤其是那些资本大鳄,加大对基础软件的投入.
* **专业概念抽象级:** 对抽象的专业逻辑概念具体化认知, 比如虚拟内存,老百姓是听不懂的,学过计算机的人都懂,具体怎么实现的很多人又都不懂了,但这并不妨碍成为一个优秀的上层应用程序员,因为虚拟内存已经被抽象出来,目的是要屏蔽上层对它的现实认知.试图用 **[鸿蒙内核源码分析(总目录)百篇博客](https://my.oschina.net/weharmony)** 去拆解那些已经被抽象出来的专业概念, 希望能卷入更多对内核感兴趣的应用软件人才流入基础软件生态, 应用软件咱们是无敌宇宙,但基础软件却很薄弱.
* **专业概念抽象级:** 对抽象的专业逻辑概念具体化认知, 比如虚拟内存,老百姓是听不懂的,学过计算机的人都懂,具体怎么实现的很多人又都不懂了,但这并不妨碍成为一个优秀的上层应用程序员,因为虚拟内存已经被抽象出来,目的是要屏蔽上层对它具体实现的认知.试图用 **[鸿蒙内核源码分析(总目录)百篇博客](https://my.oschina.net/weharmony)** 去拆解那些已经被抽象出来的专业概念, 希望能卷入更多对内核感兴趣的应用软件人才流入基础软件生态, 应用软件咱们是无敌宇宙,但基础软件却很薄弱.
* **具体微观代码级:** 这一级是具体到每一行代码的实现,到了用代码指令级的地步,这段代码是什么意思?为什么要这么设计? **[鸿蒙内核源码注解分析](https://gitee.com/weharmony/kernel_liteos_a_note)** 试图从细微处去解释代码实现层,英文真的是天生适合设计成编程语言的人类语言,计算机的01码映射到人类世界的26个字母,诞生了太多的伟大奇迹.但我们的母语注定了很大部分人存在着自然语言层级的理解映射,希望对鸿蒙内核源码注解分析能让更多爱好者快速的理解内核,共同进步.
* **具体微观代码级:** 这一级是具体到每一行代码的实现,到了用代码指令级的地步,这段代码是什么意思?为什么要这么设计?有没有更好的方案? **[鸿蒙内核源码注解分析](https://gitee.com/weharmony/kernel_liteos_a_note)** 试图从细微处去解释代码实现层,英文真的是天生适合设计成编程语言的人类语言,计算机的01码映射到人类世界的26个字母,诞生了太多的伟大奇迹.但我们的母语注定了很大部分人存在着自然语言层级的理解映射,希望鸿蒙内核源码注解分析能让更多爱好者快速的理解内核,共同进步.
## 百篇博客分析
*[鸿蒙内核源码加注释](https://gitee.com/weharmony/kernel_liteos_a_note) 过程中,整理出以下文章.内容多以 轻松口语化的故事,生活场景打比方,表格,图像 将尽可能多的内核知识点置入某种场景,具有画面感,形成多重联接路径,达到轻松记忆,甚至永久记忆的目的.
* 鸿蒙内核源码注解分析系列不是百度教条式的在说清楚一堆诘屈聱牙的概念,那没什么意思.更希望是让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了.:P
* 在给 [鸿蒙内核源码加中文注释](https://gitee.com/weharmony/kernel_liteos_a_note) 过程中,整理出以下文章.内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感.而绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思.更希望让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了.:P
* 文章和注解一样会反复修改, .xx代表修改的次数,持续完善源码注解和文档内容,精雕细琢,尽全力打磨精品内容.
### **鸿蒙源码百篇博客 往期回顾**
* [v48.xx (信号生产篇) | 生产异步通讯信号的过程 ](https://my.oschina.net/weharmony/blog/5022149) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/115768099) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/48_信号分发篇.html)[>]()**
* [v47.xx (进程回收篇) | 进程在临终前如何向老祖宗托孤 ](https://my.oschina.net/weharmony/blog/5017716) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/115672752) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/47_进程回收篇.html)[>]()**
......@@ -74,25 +76,25 @@
* [v42.xx (中断切换篇) | 中断切换到底在切换什么?](https://my.oschina.net/weharmony/blog/4990948) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114988891) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/42_中断切换篇.html)[>]()**
* [v41.xx (任务切换篇) | 汇编逐行注解分析任务上下文 ](https://my.oschina.net/weharmony/blog/4988628) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114890180) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/41_任务切换篇.html)[>]()**
* [v41.xx (任务切换篇) | 汇编告诉任务到底在切换什么 ](https://my.oschina.net/weharmony/blog/4988628) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114890180) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/41_任务切换篇.html)[>]()**
* [v40.xx (汇编汇总篇) | 所有的汇编代码都在这里 ](https://my.oschina.net/weharmony/blog/4977924) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114597179) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/40_汇编汇总篇.html)[>]()**
* [v40.xx (汇编汇总篇) | 所有的汇编代码都在这里 ](https://my.oschina.net/weharmony/blog/4977924) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114597179) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/40_汇编汇总篇.html)[>]()**
* [v39.xx (异常接管篇) | 社会很单纯,复杂的是人 ](https://my.oschina.net/weharmony/blog/4973016) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114438285) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/39_异常接管篇.html)[>]()**
* [v38.xx (寄存器篇) | ARM所有寄存器一网打尽,不再神秘 ](https://my.oschina.net/weharmony/blog/4969487) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114326994) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/38_寄存器篇.html)[>]()**
* [v38.xx (寄存器篇) | arm所有寄存器一网打尽,不再神秘 ](https://my.oschina.net/weharmony/blog/4969487) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114326994) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/38_寄存器篇.html)[>]()**
* [v37.xx (系统调用篇) | 全盘解剖系统调用实现过程 ](https://my.oschina.net/weharmony/blog/4967613) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114285166) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/37_系统调用篇.html)[>]()**
* [v37.xx (系统调用篇) | 系统调用到底经历了什么 ](https://my.oschina.net/weharmony/blog/4967613) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114285166) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/37_系统调用篇.html)[>]()**
* [v36.xx (工作模式篇) | CPU是韦小宝,有哪七个老婆? ](https://my.oschina.net/weharmony/blog/4965052) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114168567) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/36_工作模式篇.html)[>]()**
* [v36.xx (工作模式篇) | cpu是韦小宝,有哪七个老婆? ](https://my.oschina.net/weharmony/blog/4965052) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/114168567) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/36_工作模式篇.html)[>]()**
* [v35.xx (时间管理篇) | Tick是操作系统的基本时间单位 ](https://my.oschina.net/weharmony/blog/4956163) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/113867785) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/35_时间管理篇.html)[>]()**
* [v35.xx (时间管理篇) | tick是操作系统的基本时间单位 ](https://my.oschina.net/weharmony/blog/4956163) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/113867785) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/35_时间管理篇.html)[>]()**
* [v34.xx (原子操作篇) | 是谁在为原子操作保驾护航? ](https://my.oschina.net/weharmony/blog/4955290) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/113850603) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/34_原子操作篇.html)[>]()**
* [v33.xx (消息队列篇) | 进程间如何异步解耦传递大数据 ? ](https://my.oschina.net/weharmony/blog/4952961) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/113815355) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/33_消息队列篇.html)[>]()**
* [v32.xx (cpu篇) | 内核是如何描述cpu的? ](https://my.oschina.net/weharmony/blog/4952034) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/113782749) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/32_CPU篇.html)[>]()**
* [v32.xx (cpu篇) | 整个内核就是一个死循环 ](https://my.oschina.net/weharmony/blog/4952034) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/113782749) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/32_CPU篇.html)[>]()**
* [v31.xx (定时器篇) | 内核最高优先级任务是谁? ](https://my.oschina.net/weharmony/blog/4951625) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/113774260) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/31_定时器机制篇.html)[>]()**
......@@ -157,17 +159,15 @@
* [v01.xx (双向链表篇) | 谁是内核最重要结构体? ](https://my.oschina.net/u/3751245/blog/4572304) **[<]()[ csdn](https://blog.csdn.net/kuangyufei/article/details/108585659) [ | 51cto ](https://harmonyos.51cto.com/column/34)[ | harmony ](https://weharmony.gitee.io/01_双向链表篇.html)[>]()**
### 主流站点
感谢 `oschina``csdn``华为开发者论坛`, `51cto`, `掘金`,`电子发烧友`,以及其他小伙伴对系列文章的转载和推荐,无以为报,唯有不断的深挖内核地基,输出更多内容,错漏之处请多见谅,会持续完善源码注解和文档内容,精雕细琢,尽全力打磨精品内容。
### 主流站点输出
### 文章输出站点
感谢 `oschina``csdn``华为开发者论坛`, `51cto`, `掘金`,`电子发烧友`,以及其他小伙伴对系列文章的转载和推荐。
[oschina |](https://my.oschina.net/weharmony)[ csdn |](https://blog.csdn.net/kuangyufei)[ 51cto |](https://harmonyos.51cto.com/column/34)[ 简书 |](https://www.jianshu.com/u/f7f5bf861106)[ 掘金 |](https://harmonyos.51cto.com/column/34)[ 华为开发者论坛 |](https://developer.huawei.com/consumer/cn/forum/)[ 头条号 |](https://gitee.com/weharmony/docs/raw/master/pic/other/tt.png)[ 公众号 |](https://gitee.com/weharmony/docs/raw/master/pic/other/so1so.png)[ weharmony.gitee.io |](https://weharmony.gitee.io)[ weharmony.github.io |](https://weharmony.github.io)
## **Fork Me**
* 注解几乎占用了所有的空闲时间,每天都会更新,每天都有新感悟,一行行源码在不断的刷新和拓展对内核知识的认知边界. 对已经关注和fork的同学请及时同步最新的注解内容. 内核知识点体量实在太过巨大,过程会反复修正完善,力求言简意赅,词达本意.肯定会有诸多错漏之处,请多包涵. :)
注解几乎占用了所有的空闲时间,每天都会更新,每天都有新感悟,一行行源码在不断的刷新和拓展对内核知识的认知边界. 对已经关注和fork的同学请及时同步最新的注解内容. 内核知识点体量实在太过巨大,跟软件一样,会存在bug,但会反复修正完善,力求言简意赅,词达本意.
### **有哪些特殊的记号**
......
......@@ -1043,9 +1043,9 @@ LITE_OS_SEC_TEXT INT32 OsSetProcessScheduler(INT32 which, INT32 pid, UINT16 prio
SCHEDULER_UNLOCK(intSave);//还锁
LOS_MpSchedule(OS_MP_CPU_ALL);//
if (OS_SCHEDULER_ACTIVE) {//当前CPU是否激活了,激活才能调度
LOS_Schedule();//真正的任务调度算法从LOS_Schedule始
LOS_MpSchedule(OS_MP_CPU_ALL);//核间中断
if (OS_SCHEDULER_ACTIVE) {//调度是否活跃
LOS_Schedule();//发起调度
}
return LOS_OK;
......@@ -1053,12 +1053,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, TRUE);
}
//接口封装 - 获得进程调度参数
//获得进程调度方式
LITE_OS_SEC_TEXT INT32 LOS_GetProcessScheduler(INT32 pid)
{
LosProcessCB *processCB = NULL;
......@@ -1144,7 +1144,6 @@ LITE_OS_SEC_TEXT VOID OsWaitSignalToWakeProcess(LosProcessCB *processCB)
}
//将任务挂入进程的waitList链表,表示这个任务在等待某个进程的退出
//当被等待进程退出时候会将自己挂到父进程的退出子进程链表和进程组的退出进程链表.
//
STATIC VOID OsWaitInsertWaitListInOrder(LosTaskCB *runTask, LosProcessCB *processCB)
{
LOS_DL_LIST *head = &processCB->waitList;
......
......@@ -154,8 +154,8 @@ LITE_OS_SEC_BSS LosTaskCB *g_taskCBArray;//任务池 128个
LITE_OS_SEC_BSS LOS_DL_LIST g_losFreeTask;//空闲任务链表
LITE_OS_SEC_BSS LOS_DL_LIST g_taskRecyleList;//回收任务链表
LITE_OS_SEC_BSS UINT32 g_taskMaxNum;//任务最大个数
LITE_OS_SEC_BSS UINT32 g_taskScheduled; /* one bit for each cores *///一位代表一个CPU core 的调度
LITE_OS_SEC_BSS EVENT_CB_S g_resourceEvent;//关于资源的事件
LITE_OS_SEC_BSS UINT32 g_taskScheduled; /* one bit for each cores *///任务调度器,每个CPU都有对应位
LITE_OS_SEC_BSS EVENT_CB_S g_resourceEvent;//资源的事件
/* spinlock for task module, only available on SMP mode */
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_taskSpin);
......@@ -180,7 +180,7 @@ VOID OsSetMainTask()
UINT32 i;
CHAR *name = "osMain";
errno_t ret;
//为每个CPU core 设置mainTask
//为每个CPU core 设置mainTask
for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) {
g_mainTask[i].taskStatus = OS_TASK_STATUS_UNUSED;
g_mainTask[i].taskID = LOSCFG_BASE_CORE_TSK_LIMIT;//128
......@@ -193,10 +193,10 @@ VOID OsSetMainTask()
if (ret != EOK) {
g_mainTask[i].taskName[0] = '\0';
}
LOS_ListInit(&g_mainTask[i].lockList);//初始化 每个CPU core 持有的锁链表
LOS_ListInit(&g_mainTask[i].lockList);//初始化任务锁链表,上面挂的是任务已申请到的互斥锁
}
}
//空闲任务 注意 #define WEAK __attribute__((weak)) 是用于防止crash的
//空闲任务,每个CPU都有自己的空闲任务
LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID)
{
while (1) {//只有一个死循环
......@@ -222,20 +222,20 @@ LITE_OS_SEC_TEXT_MINOR VOID OsTaskPriModify(LosTaskCB *taskCB, UINT16 priority)
LOS_ASSERT(LOS_SpinHeld(&g_taskSpin));
if (taskCB->taskStatus & OS_TASK_STATUS_READY) {//只有就绪队列
if (taskCB->taskStatus & OS_TASK_STATUS_READY) {//就绪状态时,任务先出队列再入队列
processCB = OS_PCB_FROM_PID(taskCB->processID);
OS_TASK_PRI_QUEUE_DEQUEUE(processCB, taskCB);//先出队列再入队列
taskCB->priority = priority; //修改优先级
OS_TASK_PRI_QUEUE_ENQUEUE(processCB, taskCB);//再入队列,从尾部插入
} else {
taskCB->priority = priority;
taskCB->priority = priority;//不在就绪队列直接修改.
}
}
//把任务加到CPU等待链表中
LITE_OS_SEC_TEXT STATIC INLINE VOID OsAdd2TimerList(LosTaskCB *taskCB, UINT32 timeOut)
{
SET_SORTLIST_VALUE(&taskCB->sortList, timeOut);//设置idxRollNum的值为timeOut
OsAdd2SortLink(&OsPercpuGet()->taskSortLink, &taskCB->sortList);//将任务挂到定时器排序链表上
OsAdd2SortLink(&OsPercpuGet()->taskSortLink, &taskCB->sortList);//将任务挂到排序链表上
#if (LOSCFG_KERNEL_SMP == YES)//注意:这里的排序不是传统意义上12345的排序,而是根据timeOut的值来决定放到CPU core哪个taskSortLink[0:7]链表上
taskCB->timerCpu = ArchCurrCpuid();
#endif
......@@ -248,7 +248,7 @@ LITE_OS_SEC_TEXT STATIC INLINE VOID OsTimerListDelete(LosTaskCB *taskCB)
#else
SortLinkAttribute *sortLinkHeader = &g_percpu[0].taskSortLink;
#endif
OsDeleteSortLink(sortLinkHeader, &taskCB->sortList);//把task从taskSortLink链表上摘出去
OsDeleteSortLink(sortLinkHeader, &taskCB->sortList);//把任务从taskSortLink链表上摘出去
}
//插入一个TCB到空闲链表
STATIC INLINE VOID OsInsertTCBToFreeList(LosTaskCB *taskCB)
......@@ -265,7 +265,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB)
{
LosTaskCB *resumedTask = NULL;
if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) {//任务贴有
if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) {//join任务处理
if (!LOS_ListEmpty(&taskCB->joinList)) {//注意到了这里 joinList中的节点身上都有阻塞标签
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList)));//通过贴有JOIN标签链表的第一个节点找到Task
OsTaskWake(resumedTask);//唤醒任务
......@@ -383,7 +383,7 @@ LITE_OS_SEC_TEXT VOID OsTaskScan(VOID)
LOS_Schedule();//开始调度
}
}
//初始化任务
//初始化任务模块
LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID)
{
UINT32 index;
......@@ -396,21 +396,21 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID)
* This memory is resident memory and is used to save the system resources
* of task control block and will not be freed.
*/
g_taskCBArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem0, size);//任务池 常驻内存,不被释放
g_taskCBArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem0, size);//任务池常驻内存,不被释放
if (g_taskCBArray == NULL) {
return LOS_ERRNO_TSK_NO_MEMORY;
}
(VOID)memset_s(g_taskCBArray, size, 0, size);
LOS_ListInit(&g_losFreeTask);//空闲任务链表
LOS_ListInit(&g_taskRecyleList);//回收任务链表
for (index = 0; index < g_taskMaxNum; index++) {
g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED;
g_taskCBArray[index].taskID = index;//任务ID最大默认127
LOS_ListTailInsert(&g_losFreeTask, &g_taskCBArray[index].pendList);//插入空闲任务列表
}//注意:这里挂的是pendList节点,所以取TCB要通过 OS_TCB_FROM_PENDLIST 取.
LOS_ListInit(&g_losFreeTask);//初始化空闲任务链表
LOS_ListInit(&g_taskRecyleList);//初始化回收任务链表
for (index = 0; index < g_taskMaxNum; index++) {//任务挨个初始化
g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED;//默认未使用,干净.
g_taskCBArray[index].taskID = index;//任务ID [0 ~ g_taskMaxNum - 1]
LOS_ListTailInsert(&g_losFreeTask, &g_taskCBArray[index].pendList);//通过pendList节点插入空闲任务列表
}//注意:这里挂的是pendList节点,所以取TCB要通过 OS_TCB_FROM_PENDLIST 取.
ret = OsPriQueueInit();//创建32个任务优先级队列,即32个双向循环链表
ret = OsPriQueueInit();//初始化32个任务优先级队列,即32个双向循环链表
if (ret != LOS_OK) {
return LOS_ERRNO_TSK_NO_MEMORY;
}
......@@ -435,7 +435,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
{
UINT32 ret;
TSK_INIT_PARAM_S taskInitParam;
Percpu *perCpu = OsPercpuGet();//获取CPU信息
Percpu *perCpu = OsPercpuGet();//获取当前运行CPU信息
UINT32 *idleTaskID = &perCpu->idleTaskID;//每个CPU都有一个空闲任务
(VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));//任务初始参数清0
......@@ -1531,7 +1531,7 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskLock(VOID)
(*losTaskLock)++;//任务上锁数量自增
LOS_IntRestore(intSave);//启用所有IRQ和FIQ中断
}
//解锁任务
//任务解锁
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock(VOID)
{
UINT32 intSave;
......@@ -1584,7 +1584,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskID, TSK_INFO_S *taskInf
taskInfo->usTaskStatus = taskCB->taskStatus;
taskInfo->usTaskPrio = taskCB->priority;
taskInfo->uwStackSize = taskCB->stackSize;//内核态栈大小
taskInfo->uwStackSize = taskCB->stackSize; //内核态栈大小
taskInfo->uwTopOfStack = taskCB->topOfStack;//内核态栈顶位置
taskInfo->uwEventMask = taskCB->eventMask;
taskInfo->taskEvent = taskCB->taskEvent;
......@@ -1606,8 +1606,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskID, TSK_INFO_S *taskInf
SCHEDULER_UNLOCK(intSave);
return LOS_OK;
}
//CPU亲和性(affinity)就是进程要在某个给定的CPU上尽量长时间地运行而不被迁移到其他处理器
//把任务设置为由哪个CPU核调度,用于多核CPU情况,(该函数仅在SMP模式下支持)
//CPU亲和性(affinity)将任务绑在指定CPU上,用于多核CPU情况,(该函数仅在SMP模式下支持)
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuAffiSet(UINT32 taskID, UINT16 cpuAffiMask)
{
#if (LOSCFG_KERNEL_SMP == YES)
......@@ -1648,8 +1647,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuAffiSet(UINT32 taskID, UINT16 cpuAffiMa
(VOID)cpuAffiMask;
return LOS_OK;
}
//CPU亲和性(affinity)就是进程要在某个给定的CPU上尽量长时间地运行而不被迁移到其他处理器
//获取task和CPU的亲和性信息
//查询任务绑在哪个CPU上
LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskCpuAffiGet(UINT32 taskID)
{
#if (LOSCFG_KERNEL_SMP == YES)
......
......@@ -51,9 +51,9 @@ typedef enum {
#endif
typedef struct {//内核对cpu的描述
SortLinkAttribute taskSortLink; /* task sort link */ //task wait/delay 排序链表
SortLinkAttribute swtmrSortLink; /* swtmr sort link */ //定时器排序链表
UINT32 idleTaskID; /* idle task id */ //空闲任务ID 见于 OsIdleTaskCreate
SortLinkAttribute taskSortLink; /* task sort link */ //挂等待和延时的任务
SortLinkAttribute swtmrSortLink; /* swtmr sort link */ //挂定时器
UINT32 idleTaskID; /* idle task id */ //每个CPU都有一个空闲任务 见于 OsIdleTaskCreate
UINT32 taskLockCnt; /* task lock flag */ //任务锁的数量,当 > 0 的时候,需要重新调度了
UINT32 swtmrHandlerQueue; /* software timer timeout queue id */ //软时钟超时队列句柄
UINT32 swtmrTaskID; /* software timer task id */ //软时钟任务ID
......
......@@ -430,7 +430,7 @@ int OsSigAddSet(sigset_t *set, int signo)
return LOS_OK;
}
}
//获取已发送到进程,却被阻塞的所有信号
//获取阻塞当前任务的信号集
int OsSigPending(sigset_t *set)
{
LosTaskCB *tcb = NULL;
......
......@@ -226,7 +226,7 @@ int SysSigAction(int sig, const sigaction_t *restrict sa, sigaction_t *restrict
/*****************************************************
系统调用之进程信号屏蔽,
什么意思?简单说就是 一个信号来了进程要不要处理,阻塞就是不处理,注意不能阻塞SIGKILL和SIGSTOP信号,必须要处理.
什么意思?简单说就是 一个信号来了进程要不要处理,屏蔽就是不处理,注意不能屏蔽SIGKILL和SIGSTOP信号,必须要处理.
how
SIG_BLOCK 加入信号到进程屏蔽。set包含了希望阻塞的附加信号
......@@ -286,12 +286,12 @@ int SysSigTimedWait(const sigset_t_l *setl, siginfo_t *info, const struct timesp
}
return (ret == 0 ? infoIntr.si_signo : ret);
}
//IPC系统调用之暂停任务
//系统调用之暂停任务
int SysPause(void)
{
return OsPause();
}
//获取阻塞当前任务的信号集
int SysSigPending(sigset_t_l *setl)
{
sigset_t set;
......@@ -311,7 +311,7 @@ int SysSigPending(sigset_t_l *setl)
}
return ret;
}
//
int SysSigSuspend(sigset_t_l *setl)
{
sigset_t set;
......
git add -A
git commit -m '注解信号处理过程
git commit -m '完善之前的一些注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://my.oschina.net/weharmony
'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册