汇编切到main后的模块注释

    百图画鸿蒙 + 百文说内核 + 百万注源码  => 挖透鸿蒙内核源码
    鸿蒙研究站 | http://weharmonyos.com (国内)
              | https://weharmony.github.io (国外)
    oschina | https://my.oschina.net/weharmony
    博客园 | https://www.cnblogs.com/weharmony/
    知乎 | https://www.zhihu.com/people/weharmonyos
    csdn | https://blog.csdn.net/kuangyufei
    51cto | https://harmonyos.51cto.com/column/34
    掘金 | https://juejin.cn/user/756888642000808
    公众号 | 鸿蒙研究站 (weharmonyos)
上级 6dc9af1f
[![](https://gitee.com/weharmonyos/resources/raw/master/common/io.png)](http://weharmonyos.com/)
[![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/io.png)](http://weharmonyos.com/)
**中文注解鸿蒙内核 | [kernel_liteos_a_note](https://gitee.com/weharmony/kernel_liteos_a_note)** 是在 `OpenHarmony`[kernel_liteos_a](https://gitee.com/openharmony/kernel_liteos_a) 基础上给内核源码加上中文注解的版本,同步官方代码迭代推进。
......@@ -26,7 +26,7 @@
* 如果把鸿蒙比作人,百图目的是要画出其骨骼系统。
* 百图系列每张图都是心血之作,耗时甚大,能用一张就绝不用两张,所以会画的比较复杂,高清图会很大,可在公众号中回复 **百图** 获取`3`倍超高清最新图。`v**.xx`代表图的版本,请留意图的更新。
* 例如: **双向链表** 是内核最重要的结构体,站长更愿意将它比喻成人的左右手,其意义是通过寄生在宿主结构体上来体现,可想象成在宿主结构体装上一对对勤劳的双手,它真的很会来事,超级活跃分子,为宿主到处拉朋友,建圈子。其插入 | 删除 | 遍历操作是它最常用的社交三大件,若不理解透彻在分析源码过程中很容易卡壳。虽在网上能找到很多它的图,但怎么看都不是自己想要的,干脆重画了它的主要操作。
* ![](https://gitee.com/weharmonyos/resources/raw/master/100pic/1_list.png)
* ![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/100pic/1_list.png)
#### 二: 百文说内核 | 抓住主脉络 | 肌肉器官
......@@ -34,7 +34,7 @@
* 与代码需不断`debug`一样,文章内容会存在不少错漏之处,请多包涵,但会反复修正,持续更新,`v**.xx` 代表文章序号和修改的次数,精雕细琢,言简意赅,力求打造精品内容。
* 百文在 < 鸿蒙研究站 | 开源中国 | 博客园 | 51cto | csdn | 知乎 | 掘金 > 站点发布,公众号回复 **百文** 可方便阅读。
* ![](https://gitee.com/weharmonyos/resources/raw/master/common/cate.png)
* ![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/cate.png)
**基础知识**
......@@ -169,13 +169,13 @@
* 在重要模块的`.c/.h`文件开始位置先对模块功能做整体的介绍,例如异常接管模块注解如图所示:
![](https://gitee.com/weharmonyos/resources/raw/master/13/ycjg.png)
![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/13/ycjg.png)
注解过程中查阅了很多的资料和书籍,在具体代码处都附上了参考链接。
* 绘制字符图帮助理解模块 ,例如 虚拟内存区域分布没有图很难理解。
![](https://gitee.com/weharmonyos/resources/raw/master/13/vm.png)
![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/13/vm.png)
* 而函数级注解会详细到重点行,甚至每一行, 例如申请互斥锁的主体函数,不可谓不重要,而官方注释仅有一行,如图所示
![](https://gitee.com/weharmonyos/resources/raw/master/13/sop.png)
![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/13/sop.png)
* 注解创建了一些特殊记号,可直接搜索查看
- [x] 搜索 `@note_pic` 可查看绘制的全部字符图
......@@ -189,16 +189,15 @@
在中文加注版基础上构建了参考手册,如此可以看到毛细血管级的网络图,注解支持 [doxygen](https://www.doxygen.nl) 格式标准。
* 图为内核`main`的调用关系直观展现,如果没有这张图,光`main`一个函数就够喝一壶。 `main`本身是由汇编指令 `bl main`调用
![](https://gitee.com/weharmonyos/resources/raw/master/73/1.png)
![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/73/1.png)
可前往 >> [鸿蒙研究站 | 参考手册 ](http://weharmonyos.com/doxygen/index.html) 体验
* 图为内核所有结构体索引,点击可查看每个结构变量细节
![](https://gitee.com/weharmonyos/resources/raw/master/73/6.png)
![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/73/6.png)
可前往 >> [鸿蒙研究站 | 结构体索引 ](http://weharmonyos.com/doxygen/classes.html) 体验
### 四大码仓发布 | 源码同步官方
内核注解同时在 [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) | [gitcode](https://gitcode.net/kuangyufei/kernel_liteos_a_note) 发布,并与官方源码按月保持同步,同步历史如下:
* `2022/05/09` -- 标准库(musl , newlib) 目录调整
* `2022/04/16` -- 任务调度模块有很大更新
* `2022/03/23` -- 新增各CPU核自主管理中断, 定时器模块较大调整
* `2022/02/18` -- 官方无代码更新, 只有测试用例的完善
......@@ -272,7 +271,7 @@
* 研究鸿蒙需不断的翻阅资料,吸取别人的精华,其中官方文档必不可少, 为更好的呈现 **OpenHarmony开发者文档** , 特意做了静态站点 [ >> 鸿蒙研究站 | 官方文档](http://weharmonyos.com/openharmony) 来方便搜索,阅读官方资料。
* 左侧导航栏,右边索引区
![](https://gitee.com/weharmonyos/resources/raw/master/52/4.png)
![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/52/4.png)
* [鸿蒙研究站](http://weharmonyos.com) 定位于做一个专注而靠谱的技术站,没有广告,干净简洁,极佳阅读体验,持续输出,周周更新。同时感谢资助网站建设的各位小伙伴。 [ >> 我要捐助](http://weharmonyos.com/donate.html)
......@@ -281,7 +280,7 @@
### 关注不迷路 | 代码即人生
![](https://gitee.com/weharmonyos/resources/raw/master/common/so1so.png)
![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/so1so.png)
据说喜欢点赞分享的,后来都成了大神。:)
......@@ -35,7 +35,7 @@
#define CPSR_MODE_USR 0x10
#define CPSR_MODE_MASK 0x1f
/// 读CP15的系统控制寄存器到 R0寄存器
/// 读CP15的系统控制寄存器到 R0寄存器 请翻看 鸿蒙内核源码分析(协处理器篇)
STATIC INLINE UINT32 OsArmReadSctlr(VOID)
{
UINT32 val;
......@@ -510,7 +510,7 @@ STATIC INLINE UINT32 OsArmReadTlbiasidis(VOID)
__asm__ volatile("mrc p15, 0, %0, c8,c3,2" : "=r"(val));
return val;
}
/// 记录由协处理器记录当前是哪个进程在跑
STATIC INLINE VOID OsArmWriteTlbiasidis(UINT32 val)
{
__asm__ volatile("mcr p15, 0, %0, c8,c3,2" ::"r"(val));
......
......@@ -1043,16 +1043,16 @@ STATUS_T LOS_ArchMmuMove(LosArchMmu *archMmu, VADDR_T oldVaddr, VADDR_T newVaddr
*/
VOID LOS_ArchMmuContextSwitch(LosArchMmu *archMmu)
{
UINT32 ttbr;
UINT32 ttbr;//B4.1.153 TTBCR, Translation Table Base Control Register,
UINT32 ttbcr = OsArmReadTtbcr();//读取TTB寄存器的状态值
if (archMmu) {
ttbr = MMU_TTBRx_FLAGS | (archMmu->physTtb);//进程TTB物理地址值
ttbr = MMU_TTBRx_FLAGS | (archMmu->physTtb);//提供进程的映射页表地址,切换MMU代表要换进程,同一进程的线程切换并不需要切MMU
/* enable TTBR0 */
ttbcr &= ~MMU_DESCRIPTOR_TTBCR_PD0;//使能TTBR0
ttbcr &= ~MMU_DESCRIPTOR_TTBCR_PD0;//使能TTBR0 B4.1.154 TTBR0, Translation Table Base Register 0
} else {
ttbr = 0;
/* disable TTBR0 */
ttbcr |= MMU_DESCRIPTOR_TTBCR_PD0;
ttbcr |= MMU_DESCRIPTOR_TTBCR_PD0;//禁用TTBR0
}
#ifdef LOSCFG_KERNEL_VM
......@@ -1061,13 +1061,13 @@ VOID LOS_ArchMmuContextSwitch(LosArchMmu *archMmu)
ISB; //指令必须同步 ,清楚流水线中未执行指令
#endif
OsArmWriteTtbr0(ttbr);//通过r0寄存器将进程页面基址写入TTB
ISB; //指令必须同步
ISB;
OsArmWriteTtbcr(ttbcr);//写入TTB状态位
ISB; //指令必须同步
ISB;
#ifdef LOSCFG_KERNEL_VM
if (archMmu) {
OsArmWriteContextidr(archMmu->asid);//通过R0寄存器写入进程标识符至C13寄存器
ISB;
ISB; // 可查看 鸿蒙内核源码分析(优雅的宏篇)
}
#endif
}
......
......@@ -152,7 +152,7 @@ reset_vector: //鸿蒙开机代码
MOV r3, #0x40000000 //EN, bit[30] 设置FPEXCEN位来使能FPU
VMSR FPEXC, r3 //浮点异常控制寄存器 (Floating-Point Exception Control register | B4.1.57)
/* r11: delta of physical address and virtual address | 内核运行虚拟地址和物理地址之间的差值 */
/* r11: delta of physical address and virtual address | 计算虚拟地址和物理地址之间的差值,目的是为了建立映射关系表 */
adr r11, pa_va_offset //获取pa_va_offset变量物理地址,由于这时候mmu已经被关闭,所以这个值就表示pa_va_offset变量的物理地址。
/*adr 是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。
*编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距离,然后用一条ADD或者SUB指令替换这条伪指令,
......@@ -164,7 +164,7 @@ reset_vector: //鸿蒙开机代码
mrc p15, 0, r12, c0, c0, 5 /* Multiprocessor Affinity Register-MPIDR */
and r12, r12, #MPIDR_CPUID_MASK //掩码过滤
cmp r12, #0 //主控核0判断
bne secondary_cpu_init //初始化CPU次核
bne secondary_cpu_init //初始化CPU次核
/*
* adr是小范围的地址读取伪指令,它将基于PC寄存器相对偏移的地址值读取到寄存器中,
* 例如: 0x00000004 : adr r4, __exception_handlers
......@@ -193,7 +193,7 @@ reloc_img_to_bottom_loop://重定位镜像到内核物理内存基地址,将内
bne reloc_img_to_bottom_loop
sub pc, r12 /* 重新校准pc寄存器, 无缝跳到了拷贝后的指令地址处执行 r12是重定位镜像前内核加载基地址和内核物理内存基地址的差值 */
nop // 注意执行完成sub pc, r12,新的PC寄存器也指向了 nop ,nop是伪汇编指令,等同于 mov r0 r0 通常用于控制时序的目的,强制内存对齐,防止流水线灾难,占据分支指令延迟
sub r11, r11, r12 /* r11: eventual address offset | 最终地址映射偏移量, 用于MMU打开后使用 */
sub r11, r11, r12 /* r11: eventual address offset | 最终地址映射偏移量, 用于构建MMU页表 */
//内核总大小 __bss_start - __exception_handlers
reloc_img_to_bottom_done:
#ifdef LOSCFG_KERNEL_MMU
......
......@@ -145,11 +145,11 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 PlatformInit(VOID)
{
return LOS_OK;
}
//内核关键模块初始化
LITE_OS_SEC_TEXT_INIT STATIC UINT32 KModInit(VOID)
{
#ifdef LOSCFG_BASE_CORE_SWTMR_ENABLE
OsSwtmrInit();
OsSwtmrInit(); //软件定时器模块 , 软定由专门的 0 级任务实现
#endif
return LOS_OK;
}
......@@ -196,13 +196,13 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsMain(VOID)
}
OsInitCall(LOS_INIT_LEVEL_EARLIEST);
ret = ArchEarlyInit();
ret = ArchEarlyInit(); //架构级初始化,包括硬中断
if (ret != LOS_OK) {
return ret;
}
OsInitCall(LOS_INIT_LEVEL_ARCH_EARLY);
ret = PlatformEarlyInit();
ret = PlatformEarlyInit();//平台级初始化
if (ret != LOS_OK) {
return ret;
}
......
......@@ -45,7 +45,7 @@ LITE_OS_SEC_TEXT_INIT INT32 main(VOID)//由主CPU执行,默认0号CPU 为主CPU
return (INT32)LOS_NOK;
}
CPU_MAP_SET(0, OsHwIDGet());//设置CPU映射,参数0 代表0号CPU
CPU_MAP_SET(0, OsHwIDGet());//设置主CPU映射信息
OsSchedStart();//调度开始
......
git add -A
git commit -m ' 继续完善对开机启动汇编代码注释
git commit -m ' 汇编切到main后的模块注释
百图画鸿蒙 + 百文说内核 + 百万注源码 => 挖透鸿蒙内核源码
鸿蒙研究站 | http://weharmonyos.com (国内)
| https://weharmony.github.io (国外)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册