Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
鸿蒙内核源码分析
注释鸿蒙内核源码
提交
fbfec390
注释鸿蒙内核源码
项目概览
鸿蒙内核源码分析
/
注释鸿蒙内核源码
通知
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 搜索 >>
提交
fbfec390
编写于
4月 19, 2021
作者:
鸿蒙内核源码分析
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
完善之前的一些注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://my.oschina.net/weharmony
上级
500f93bb
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
58 addition
and
61 deletion
+58
-61
README.md
README.md
+19
-19
kernel/base/core/los_process.c
kernel/base/core/los_process.c
+5
-6
kernel/base/core/los_task.c
kernel/base/core/los_task.c
+25
-27
kernel/base/include/los_percpu_pri.h
kernel/base/include/los_percpu_pri.h
+3
-3
kernel/base/ipc/los_signal.c
kernel/base/ipc/los_signal.c
+1
-1
syscall/ipc_syscall.c
syscall/ipc_syscall.c
+4
-4
zzz/git/push.sh
zzz/git/push.sh
+1
-1
未找到文件。
README.md
浏览文件 @
fbfec390
...
...
@@ -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 (时间管理篇) |
T
ick是操作系统的基本时间单位
](
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 (时间管理篇) |
t
ick是操作系统的基本时间单位
](
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,但会反复修正完善,力求言简意赅,词达本意.
### **有哪些特殊的记号**
...
...
kernel/base/core/los_process.c
浏览文件 @
fbfec390
...
...
@@ -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
;
...
...
kernel/base/core/los_task.c
浏览文件 @
fbfec390
...
...
@@ -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)
...
...
kernel/base/include/los_percpu_pri.h
浏览文件 @
fbfec390
...
...
@@ -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
...
...
kernel/base/ipc/los_signal.c
浏览文件 @
fbfec390
...
...
@@ -430,7 +430,7 @@ int OsSigAddSet(sigset_t *set, int signo)
return
LOS_OK
;
}
}
//获取
已发送到进程,却被阻塞的所有信号
//获取
阻塞当前任务的信号集
int
OsSigPending
(
sigset_t
*
set
)
{
LosTaskCB
*
tcb
=
NULL
;
...
...
syscall/ipc_syscall.c
浏览文件 @
fbfec390
...
...
@@ -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
;
...
...
zzz/git/push.sh
浏览文件 @
fbfec390
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录