提交 747b8426 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析
上级 8a9b0635
[鸿蒙内核源码注释中文版 【 CSDN仓](https://codechina.csdn.net/kuangyufei/kernel_liteos_a_note) | [Gitee仓](https://gitee.com/weharmony/kernel_liteos_a_note) | [Github仓](https://github.com/kuangyufei/kernel_liteos_a_note) | [Coding仓】](https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files)是基于鸿蒙官方开源项目[kernel\_liteos\_a](https://codechina.csdn.net/openharmony/kernel_liteos_a)加上中文注释版本, 加注版现已上线,四大代码仓库同步更新,笔者力争给每行鸿蒙内核源码加上中文注释. 源码持续加注中....
[鸿蒙内核源码注释中文版 【 CSDN仓](https://codechina.csdn.net/kuangyufei/kernel_liteos_a_note) | [Gitee仓](https://gitee.com/weharmony/kernel_liteos_a_note) | [Github仓](https://github.com/kuangyufei/kernel_liteos_a_note) | [Coding仓】](https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files)是基于鸿蒙官方开源项目[OpenHarmony/kernel_liteos_a](https://codechina.csdn.net/openharmony/kernel_liteos_a)加上中文注释版本, 现已开放,四大代码仓库同步更新,笔者力争给每行鸿蒙内核源码加上中文注释. 源码持续加注中....
[鸿蒙源码分析系列篇 【 CSDN](https://blog.csdn.net/kuangyufei)[ | OSCHINA】](https://my.oschina.net/u/3751245) 是笔者在加注过程中的心得总结,从更宏观的视角整理成文, 并首创用生活场景讲故事的方式试图去解构内核,一窥究竟。内容仅代表个人观点,过程肯定会有错漏之处,会反复修正,欢迎指正完善。博文持续更新...
[鸿蒙源码分析系列篇 【 CSDN](https://blog.csdn.net/kuangyufei)[ | OSCHINA】](https://my.oschina.net/u/3751245) 是笔者在加注过程中的心得总结,从更宏观的视角整理成文, 并首创用生活场景讲故事的方式试图去解构内核,一窥究竟。内容仅代表个人观点,过程肯定会有错漏之处,会反复修正,出精品注释,同时欢迎指正完善。博文持续更新...
# **kernel_liteos_a_note: 鸿蒙内核源码注释中文版**
# **[kernel_liteos_a_note](https://gitee.com/weharmony/kernel_liteos_a_note): 鸿蒙内核源码注释中文版**
每个码农,职业生涯, 都应精读一遍内核源码. 鸿蒙内核源码就是是很好的精读项目.
## **做了些什么呢**
**kernel_liteos_a_note** 是在鸿蒙官方内核开源项目 **[kernel_liteos_a](https://gitee.com/openharmony/kernel_liteos_a)** 基础上给源码加上中文注释的版本,目前已完成部分模块,正在持续加注中....
**[kernel_liteos_a_note](https://gitee.com/weharmony/kernel_liteos_a_note)** 是在鸿蒙官方开源项目 **[OpenHarmony/kernel_liteos_a](https://gitee.com/openharmony/kernel_liteos_a)** 基础上给源码加上中文注释的版本,目前已完成部分模块,正在持续加注中....
* ### **为何想给鸿蒙源码加上中文注释**
源于注者大学时阅读linux 2.6 内核痛苦经历,一直有个心愿,想让更多对内核感兴趣的同学减少阅读时间,加速对内核源码的理解,不至于过早的放弃.但因过程种种,一直没有成行,基本要放弃这件事了.
但9月10日鸿蒙正式开源,重新激活了注者多年的心愿,就有那么点一发不可收拾了 :|P
* ### **致敬鸿蒙内核开发者**
感谢开放原子开源基金会,鸿蒙内核开发者提供了如此优秀的源码,让笔者一了多年的夙愿,津津乐道于此.越深入精读内核源码,越能感受到设计者的精巧用心,创新突破. 向开发者致敬. 可以毫不夸张的说 kernel_liteos_a 可作为大学C语言,数据结构,操作系统,汇编语言 四门课程的教学项目.如此宝库,不深入研究实在是太可惜了.
感谢开放原子开源基金会,鸿蒙内核开发者提供了如此优秀的源码,让笔者一了多年的夙愿,津津乐道于此.越深入精读内核源码,越能感受到设计者的精巧用心,创新突破. 向开发者致敬. 可以毫不夸张的说鸿蒙内核 **[OpenHarmony/kernel_liteos_a](https://gitee.com/openharmony/kernel_liteos_a)** 可作为大学C语言,数据结构,操作系统,汇编语言 四门课程的教学项目.如此宝库,不深入研究实在是太可惜了.
* ### **理解内核的三个层级**
笔者认为理解内核需分三个层级:
第一: **普通概念映射级** 这一级不涉及专业知识,用大众所熟知的公共认知就能听明白是个什么概念,也就是说用一个普通人都懂的概念去诠释或者映射一个他们从没听过的概念.说别人能听得懂的话这很重要!!! 一个没学过计算机知识的卖菜大妈就不可能知道内核的基本运作了吗?答案是否定的,笔者在系列篇中试图用张大爷的故事去构建这一层级的认知,希望能卷入更多的人来关注基础软件,尤其是那些有钱的投资人加大对国家基础软件的投入.
第一: **普通概念映射级** 这一级不涉及专业知识,用大众所熟知的公共认知就能听明白是个什么概念,也就是说用一个普通人都懂的概念去诠释或者映射一个他们从没听过的概念.说别人能听得懂的话这很重要!!! 一个没学过计算机知识的卖菜大妈就不可能知道内核的基本运作了吗? NO!,笔者在系列篇中试图用 **[鸿蒙源码分析系列篇|张大爷系列故事【 CSDN](https://blog.csdn.net/kuangyufei)[ | OSCHINA】](https://my.oschina.net/u/3751245)** 去构建这一层级的认知,希望能卷入更多的人来关注基础软件,尤其是那些有钱的投资人加大对国家基础软件的投入.
第二: **专业概念抽象级** 这一级是抽象出一个专业的逻辑概念,让学过点计算机知识的人能听得懂,但不要去了解具体的细节点, 比如虚拟内存,老百姓是听不懂的,学过计算机的人都懂,具体怎么实现的很多人都不懂了,但这并不妨碍成为一个优秀的上层程序员,笔者试图用系列篇去构建这一层级的认知,希望能卷入更多对内核感兴趣的应用软件人才流入基础软件生态, 应用软件咱们无敌宇宙,但基础软件却很薄弱.
第二: **专业概念抽象级** 这一级是抽象出一个专业的逻辑概念,让学过点计算机知识的人能听得懂,可以不用去了解具体的细节点, 比如虚拟内存,老百姓是听不懂的,学过计算机的人都懂,具体怎么实现的很多人又都不懂了,但这并不妨碍成为一个优秀的上层应用程序员,笔者试图用 **[鸿蒙源码分析系列篇 【 CSDN](https://blog.csdn.net/kuangyufei)[ | OSCHINA】](https://my.oschina.net/u/3751245)** 去构建这一层级的认知,希望能卷入更多对内核感兴趣的应用软件人才流入基础软件生态, 应用软件咱们是无敌宇宙,但基础软件却很薄弱.
第三: **具体微观代码级** 这一级是具体到每一行代码的实现,到了用代码说话的地步,鸿蒙内核源码注释中文版试图解构这一层级的认知,英文是天生适合设计成编程语言的人类语言,计算机的01码映射到人类世界的26个字母,诞生了太多的伟大奇迹.加上中文注释也是想让更多感兴趣的人能更深入的理解内核,我们的母语注定了很大部分人存在着语言层级的映射.
第三: **具体微观代码级** 这一级是具体到每一行代码的实现,到了用代码指令级的地步, **[鸿蒙内核源码注释中文版 kernel_liteos_a_note](https://gitee.com/weharmony/kernel_liteos_a_note)** 试图解构这一层级的认知,英文是天生适合设计成编程语言的人类语言,计算机的01码映射到人类世界的26个字母,诞生了太多的伟大奇迹.但我们的母语注定了很大部分人存在着语言层级的映射,希望注释中文版能让更多感兴趣的人能更深入的喜欢内核.
好记性不如烂笔头,笔者把研究过程心得写成鸿蒙源码分析系列篇,如此 源码中文注释+系列篇文章 = 快速准确理解鸿蒙内核实现过程.
好记性不如烂笔头,笔者把研究过程心得写成鸿蒙源码分析系列篇,如此 源码中文注释+系列篇文章 = 加速理解鸿蒙内核实现过程.
系列篇文章 进入 >> [鸿蒙系统源码分析(总目录) 【CSDN](https://blog.csdn.net/kuangyufei) | [OSCHINA】](https://my.oschina.net/u/3751245)查看,两大站点持续更新....
......@@ -32,25 +37,22 @@
* ### **加注释方式是怎样的?**
因鸿蒙内核本身只有很少的注释, 所以笔者不能去破坏原有的结构,注释以不对原有代码侵入为前提,源码所有英文部分都是原有鸿蒙注释,所有中文部分都是笔者的注释,尽量不去增加代码的行数,不破坏文件的结构,注释多类似以下的方式,如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022075449282.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2t1YW5neXVmZWk=,size_16,color_FFFFFF,t_70#pic_center)
另外笔者用字符画了一些图方便理解,直接嵌入到头文件中,比如虚拟内存的全景图,因没有这些图是很难理解内存是如何管理的,后续还会陆续加入更多的图方便理解.
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022075929701.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2t1YW5neXVmZWk=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201022075929701.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2t1YW5neXVmZWk=,size_16,color_FFFFFF,t_70#pic_center)
* ### **仰望星空还是埋头走路**
精读内核源码当然是件很困难的事,但正因为很难才值得去做! 内心不渴望的永远不可能靠近自己.笔者一直坚信兴趣是最好的老师,加注就是在做自己感兴趣的事, 希望感兴趣的各位能看到.如果能让更多人参与到内核的研究,减少学习的成本,哪怕就节省一天的时间,这么多人能节省多少时间, 这是件多好玩,多有意义的事情啊.
精读内核源码当然是件很困难的事,但正因为很难才值得去做! 内心不渴望的永远不可能靠近自己.笔者一直坚信兴趣是最好的老师,加注就是在做自己感兴趣的事.如果能让更多人参与到内核的研究,减少学习的成本,哪怕就节省一天的时间,这么多人能节省多少时间, 这是件多好玩,多有意义的事情啊.
系列篇和源码注释将反复修改更新,工作量虽大,然兴趣所致,乐此不疲. 其中所写所注仅代表个人观点,肯定会有错漏之处,请多指正完善.
时代需要仰望星空的人,但也需要埋头走路的人,心中有目标,就不怕道阻且长.
* ### **新增的zzz目录是干什么的?**
中文加注版比官方版多了一个zzz的目录,里面放了一些笔者使用的文件,比如测试代码,它与内核代码无关,大家可以忽略它,取名zzz是为了排在最后,减少对原有代码目录级的侵人,zzz的想法源于微信中名称为AAA的那批用户,这些人你的微信里应该也有吧 :|P
* ### **为何想给源码加上中文注释**
源于注者大学时阅读linux2.6内核痛苦经历,一直有个心结,想让更多对内核感兴趣的同学减少阅读时间,加速源码的理解,不至于过早的放弃.但因过程种种,一直没有成行,基本要放弃这件事了.
9月11日鸿蒙正式开源,重新燃起了注者多年的心火,就有那么点一发可收拾了 :|P
中文加注版比官方版只多了一个zzz的目录,里面放了一些笔者使用的文件,比如测试代码,datasheet,它与内核代码无关,大家可以忽略它,取名zzz是为了排在最后,减少对原有代码目录级的侵入,zzz的想法源于微信中名称为AAA的那批牛人,这些人你的微信里应该也有吧 :|P
* ### **笔者联系方式**
......
......@@ -38,24 +38,24 @@
extern "C" {
#endif
#endif /* __cplusplus */
//排序链表,这是通用处理函数
//排序链表,这是通用处理函数 内核有两处使用 OsSwtmrInit 和 OsTaskInit 见于 Percpu 结构体
LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
{
UINT32 size;
LOS_DL_LIST *listObject = NULL;
UINT32 index;
size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;
size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;//这行代码很精彩,得到 8个 LOS_DL_LIST
listObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size); /* system resident resource *///常驻内存
if (listObject == NULL) {
return LOS_NOK;
}
(VOID)memset_s(listObject, size, 0, size);
sortLinkHeader->sortLink = listObject;
sortLinkHeader->cursor = 0;
for (index = 0; index < OS_TSK_SORTLINK_LEN; index++, listObject++) {
LOS_ListInit(listObject);
(VOID)memset_s(listObject, size, 0, size);//清0
sortLinkHeader->sortLink = listObject;//可以知道 sortLink是个链表数组
sortLinkHeader->cursor = 0;//游标默认为0
for (index = 0; index < OS_TSK_SORTLINK_LEN; index++, listObject++) {// OS_TSK_SORTLINK_LEN = 8
LOS_ListInit(listObject);//初始化8个链表
}
return LOS_OK;
}
......@@ -71,8 +71,8 @@ LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, So
/*
* huge rollnum could cause carry to invalid high bit
* and eventually affect the calculation of sort index.
*/
if (sortList->idxRollNum > OS_TSK_MAX_ROLLNUM) {
*/ //巨大的滚动数可能导致进位无效最终影响排序指标的计算。
if (sortList->idxRollNum > OS_TSK_MAX_ROLLNUM) { //滚动数索引最大就是 OS_TSK_MAX_ROLLNUM
SET_SORTLIST_VALUE(sortList, OS_TSK_MAX_ROLLNUM);
}
timeout = sortList->idxRollNum;
......
......@@ -39,7 +39,7 @@ extern "C" {
#endif /* __cplusplus */
#define OS_MAX_VALUE 0xFFFFFFFF
//获取Tick数量
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
{
UINT32 intSave;
......@@ -50,7 +50,7 @@ LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
* the tick needs to be atomic.
*/
TICK_LOCK(intSave);
tick = g_tickCount[0];
tick = g_tickCount[0];//使用CPU core0作为系统的 tick数
TICK_UNLOCK(intSave);
return tick;
......@@ -60,7 +60,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID)
{
return g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND;
}
//毫秒转Tick
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec)
{
if (millisec == OS_MAX_VALUE) {
......@@ -69,7 +69,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec)
return ((UINT64)millisec * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_MS_PER_SECOND;
}
//Tick转毫秒
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick)
{
return ((UINT64)tick * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND;
......
......@@ -47,7 +47,7 @@ extern "C" {
#endif /* __cplusplus */
LITE_OS_SEC_BSS volatile UINT64 g_tickCount[LOSCFG_KERNEL_CORE_NUM] = {0};//tick计数器,系统一旦启动,一直在++, 为防止溢出,这是一个 UINT64 的变量
LITE_OS_SEC_DATA_INIT UINT32 g_sysClock;
LITE_OS_SEC_DATA_INIT UINT32 g_sysClock;//系统时钟
LITE_OS_SEC_DATA_INIT UINT32 g_tickPerSecond;//每秒Tick数,鸿蒙默认是每秒100次,即:10ms
LITE_OS_SEC_BSS DOUBLE g_cycle2NsScale;
......
......@@ -47,31 +47,31 @@ extern "C" {
#error "queue maxnum cannot be zero"
#endif /* LOSCFG_BASE_IPC_QUEUE_LIMIT <= 0 */
LITE_OS_SEC_BSS LosQueueCB *g_allQueue = NULL;
LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_freeQueueList;
LITE_OS_SEC_BSS LosQueueCB *g_allQueue = NULL;//管理所有IPC队列
LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_freeQueueList;//IPC空闲队列链表,管分配的,需要队列就从free中申请
/*
* Description : queue initial
* Return : LOS_OK on success or error code on failure
*/
LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)
LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)//IPC 队列初始化
{
LosQueueCB *queueNode = NULL;
UINT32 index;
UINT32 size;
size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(LosQueueCB);
size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(LosQueueCB);//支持1024个IPC队列
/* system resident memory, don't free */
g_allQueue = (LosQueueCB *)LOS_MemAlloc(m_aucSysMem0, size);
g_allQueue = (LosQueueCB *)LOS_MemAlloc(m_aucSysMem0, size);//常驻内存
if (g_allQueue == NULL) {
return LOS_ERRNO_QUEUE_NO_MEMORY;
}
(VOID)memset_s(g_allQueue, size, 0, size);
LOS_ListInit(&g_freeQueueList);
for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) {
queueNode = ((LosQueueCB *)g_allQueue) + index;
queueNode->queueID = index;
LOS_ListTailInsert(&g_freeQueueList, &queueNode->readWriteList[OS_QUEUE_WRITE]);
(VOID)memset_s(g_allQueue, size, 0, size);//清0
LOS_ListInit(&g_freeQueueList);//初始化空闲链表
for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) {//循环
queueNode = ((LosQueueCB *)g_allQueue) + index;//取item
queueNode->queueID = index;//记录队列index
LOS_ListTailInsert(&g_freeQueueList, &queueNode->readWriteList[OS_QUEUE_WRITE]);//挂入空闲队列链表上
}
if (OsQueueDbgInitHook() != LOS_OK) {
......@@ -79,7 +79,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)
}
return LOS_OK;
}
//创建一个队列
LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreate(CHAR *queueName, UINT16 len, UINT32 *queueID,
UINT32 flags, UINT16 maxMsgSize)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册