热爱是所有的理由和答案

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    https://weharmony.gitee.io
上级 4cf40f80
[![在这里插入图片描述](https://gitee.com/weharmony/docs/raw/master/pic/other/io.png)](https://weharmony.gitee.io)
百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新[< Gitee ](https://gitee.com/weharmony/kernel_liteos_a_note)[| Github ](https://github.com/kuangyufei/kernel_liteos_a_note)[| CSDN ](https://codechina.csdn.net/kuangyufei/kernel_liteos_a_note)[| Coding >](https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files)
百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新[< gitee ](https://gitee.com/weharmony/kernel_liteos_a_note)[| github ](https://github.com/kuangyufei/kernel_liteos_a_note)[| csdn ](https://codechina.csdn.net/kuangyufei/kernel_liteos_a_note)[| coding >](https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files)
百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,多站点每日同步更新[< OSCHINA ](https://my.oschina.net/u/3751245/blog/4626852)[| CSDN ](https://blog.csdn.net/kuangyufei/article/details/108727970)[| WeHarmony >](https://weharmony.gitee.io/)
百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,多站点每日同步更新[< oschina ](https://my.oschina.net/u/3751245/blog/4626852)[| csdn ](https://blog.csdn.net/kuangyufei/article/details/108727970)[| weharmony >](https://weharmony.gitee.io/)
---
......@@ -57,92 +57,97 @@
**[鸿蒙内核源码加注释](https://gitee.com/weharmony/kernel_liteos_a_note)** 过程中,整理出以下文章.
* (总目录) | 百万汉字注解 百篇博客分析[< csdn](https://blog.csdn.net/kuangyufei) [ | oschina >](https://my.oschina.net/weharmony)
### **故事篇**
* (总目录) | 百万汉字注解 百篇博客分析[< CSDN](https://blog.csdn.net/kuangyufei) [ | OSCHINA >](https://my.oschina.net/weharmony)
* (调度故事篇) | 用故事说内核调度 [< csdn](https://blog.csdn.net/kuangyufei/article/details/108745174) [ | oschina >](https://my.oschina.net/u/3751245/blog/4634668)
### **故事篇**
* (内存主奴篇) | 用故事说内存管理 [< csdn](https://blog.csdn.net/kuangyufei/article/details/108723672) [ | oschina >](https://my.oschina.net/u/3751245/blog/4646802)
* (调度故事篇) | 通俗易懂故事说内核 [< CSDN](https://blog.csdn.net/kuangyufei/article/details/108745174) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4634668)
* (源码注释篇) | 热爱是所有的理由和答案[< csdn](https://blog.csdn.net/kuangyufei/article/details/109251754) [ | oschina >](https://my.oschina.net/u/3751245/blog/4686747)
* (内存主奴篇) | 紫禁城的主子和奴才如何相处? [< CSDN](https://blog.csdn.net/kuangyufei/article/details/108723672) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4646802)
### **ARM汇编篇**
### **进程/线程**
* (系统调用篇) | 全盘解剖鸿蒙系统调用实现过程[< csdn](https://blog.csdn.net/kuangyufei/article/details/114285166) [ | oschina >](https://my.oschina.net/weharmony/blog/4967613)
* (CPU篇) | 内核是如何描述CPU的 ?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/113782749) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4952034)
* (工作模式篇) | 鸿蒙开机代码长啥样?[< csdn](https://blog.csdn.net/kuangyufei/article/details/114168567) [ | oschina >](https://my.oschina.net/weharmony/blog/4965052)
* (并发并行篇) | 内核如何管理多个CPU?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/113516222) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4940329)
* (汇编传参篇) | 汇编如何传递复杂的参数?[< csdn](https://blog.csdn.net/kuangyufei/article/details/113265990) [ | oschina >](https://my.oschina.net/u/3751245/blog/4927892)
* (调度机制篇) | 任务是如何被调度执行的?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108705968) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4623040)
* (汇编基础篇) | CPU在哪里打卡上班 ?[< csdn](https://blog.csdn.net/kuangyufei/article/details/112986628) [ | oschina >](https://my.oschina.net/u/3751245/blog/4920361)
* (调度队列篇) | 就绪队列对调度的作用[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108626671) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4606916)
### **进程/线程篇**
* (任务管理篇) | 任务是内核调度的单元[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108621428) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4603919)
* (CPU篇) | 内核是如何描述CPU的 ?[< csdn](https://blog.csdn.net/kuangyufei/article/details/113782749) [ | oschina >](https://my.oschina.net/weharmony/blog/4952034)
* (时钟任务篇) | 调度最大的动力来自哪里?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108603468) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4574493)
* (并发并行篇) | 内核如何管理多个CPU?[< csdn](https://blog.csdn.net/kuangyufei/article/details/113516222) [ | oschina >](https://my.oschina.net/u/3751245/blog/4940329)
* (进程管理篇) | 进程是内核资源管理单元[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108595941) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4574429)
* (调度机制篇) | 任务是如何被调度执行的?[< csdn](https://blog.csdn.net/kuangyufei/article/details/108705968) [ | oschina >](https://my.oschina.net/u/3751245/blog/4623040)
* (线程概念篇) | 是谁在不断的折腾CPU?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/112870193) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4915543)
* (调度队列篇) | 就绪队列对调度的作用[< csdn](https://blog.csdn.net/kuangyufei/article/details/108626671) [ | oschina >](https://my.oschina.net/u/3751245/blog/4606916)
* (进程概念篇) | 进程都管理了哪些资源?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/113395872) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4937521)
* (任务管理篇) | 任务是内核调度的单元[< csdn](https://blog.csdn.net/kuangyufei/article/details/108621428) [ | oschina >](https://my.oschina.net/u/3751245/blog/4603919)
### **进程通讯**
* (消息队列篇) | 进程间如何异步解耦传递大数据 ? [< CSDN](https://blog.csdn.net/kuangyufei/article/details/113815355) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4952961)
* (时钟任务篇) | 调度最大的动力来自哪里?[< csdn](https://blog.csdn.net/kuangyufei/article/details/108603468) [ | oschina >](https://my.oschina.net/u/3751245/blog/4574493)
* (事件控制篇) | 任务间一对多和多对多的同步方案 [< CSDN](https://blog.csdn.net/kuangyufei/article/details/113759481) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4950956)
* (进程管理篇) | 进程是内核资源管理单元[< csdn](https://blog.csdn.net/kuangyufei/article/details/108595941) [ | oschina >](https://my.oschina.net/u/3751245/blog/4574429)
* (信号量篇) | 信号量解决任务同步问题 [< CSDN](https://blog.csdn.net/kuangyufei/article/details/113744267) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4949720)
* (进程通讯篇) | 九大通讯方式一网打尽 [< CSDN](https://blog.csdn.net/kuangyufei/article/details/113700751) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4947398)
* (线程概念篇) | 是谁在不断的折腾CPU?[< csdn](https://blog.csdn.net/kuangyufei/article/details/112870193) [ | oschina >](https://my.oschina.net/u/3751245/blog/4915543)
* (互斥锁篇) | 互斥锁比自旋锁丰满许多 [< CSDN](https://blog.csdn.net/kuangyufei/article/details/113660357) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4945465)
* (进程概念篇) | 进程都管理了哪些资源?[< csdn](https://blog.csdn.net/kuangyufei/article/details/113395872) [ | oschina >](https://my.oschina.net/u/3751245/blog/4937521)
### **通讯方式篇**
* (自旋锁篇) | 汇编到令人心碎的自旋锁 [< CSDN](https://blog.csdn.net/kuangyufei/article/details/113616250) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4944129)
* (消息队列篇) | 进程间如何异步解耦传递大数据 ? [< csdn](https://blog.csdn.net/kuangyufei/article/details/113815355) [ | oschina >](https://my.oschina.net/weharmony/blog/4952961)
### **内存篇**
* (事件控制篇) | 任务间一对多和多对多的同步方案 [< csdn](https://blog.csdn.net/kuangyufei/article/details/113759481) [ | oschina >](https://my.oschina.net/weharmony/blog/4950956)
* (物理内存篇) | 伙伴算法是在卖标准猪肉块吗?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/111765600) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4842408)
* (信号量篇) | 信号量解决任务同步问题 [< csdn](https://blog.csdn.net/kuangyufei/article/details/113744267) [ | oschina >](https://my.oschina.net/weharmony/blog/4949720)
* (进程通讯篇) | 九大通讯方式一网打尽 [< csdn](https://blog.csdn.net/kuangyufei/article/details/113700751) [ | oschina >](https://my.oschina.net/weharmony/blog/4947398)
* (内存规则篇) | 内存管理到底在管什么?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/109437223) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4698384)
* (互斥锁篇) | 互斥锁比自旋锁丰满许多 [< csdn](https://blog.csdn.net/kuangyufei/article/details/113660357) [ | oschina >](https://my.oschina.net/weharmony/blog/4945465)
* (内存映射篇) | 什么是内存最重要的实现基础 ?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/109032636) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4694841)
* (自旋锁篇) | 汇编到令人心碎的自旋锁 [< csdn](https://blog.csdn.net/kuangyufei/article/details/113616250) [ | oschina >](https://my.oschina.net/weharmony/blog/4944129)
* (内存汇编篇) | 什么是虚拟内存的实现基础?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108994081) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4692156)
### **内存篇**
* (内存分配篇) | 内存有哪些分配方式?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108989906) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4646802)
* (物理内存篇) | 伙伴算法是在卖标准猪肉块吗?[< csdn](https://blog.csdn.net/kuangyufei/article/details/111765600) [ | oschina >](https://my.oschina.net/u/3751245/blog/4842408)
* (内存管理篇) | 虚拟内存全景图是怎样的?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108821442) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4652284)
* (内存规则篇) | 内存管理到底在管什么?[< csdn](https://blog.csdn.net/kuangyufei/article/details/109437223) [ | oschina >](https://my.oschina.net/u/3751245/blog/4698384)
* (内存主奴篇) | 紫禁城的主子和奴才如何相处?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108723672) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4646802)
* (内存映射篇) | 什么是内存最重要的实现基础 ?[< csdn](https://blog.csdn.net/kuangyufei/article/details/109032636) [ | oschina >](https://my.oschina.net/u/3751245/blog/4694841)
### **基础篇**
* (内存汇编篇) | 什么是虚拟内存的实现基础?[< csdn](https://blog.csdn.net/kuangyufei/article/details/108994081) [ | oschina >](https://my.oschina.net/u/3751245/blog/4692156)
* (时间管理篇) | Tick是操作系统的基本时间单位 [< CSDN](https://blog.csdn.net/kuangyufei/article/details/113867785) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4956163)
* (内存分配篇) | 内存有哪些分配方式?[< csdn](https://blog.csdn.net/kuangyufei/article/details/108989906) [ | oschina >](https://my.oschina.net/u/3751245/blog/4646802)
* (原子操作篇) | 是哪两条汇编指令在为原子操作保驾护航 ? [< CSDN](https://blog.csdn.net/kuangyufei/article/details/113850603) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4955290)
* (内存管理篇) | 虚拟内存全景图是怎样的?[< csdn](https://blog.csdn.net/kuangyufei/article/details/108821442) [ | oschina >](https://my.oschina.net/u/3751245/blog/4652284)
* (定时器机制篇) | 内核最高优先级任务是谁???[< CSDN](https://blog.csdn.net/kuangyufei/article/details/113774260) [ | OSCHINA >](https://my.oschina.net/weharmony/blog/4951625)
* (内存主奴篇) | 紫禁城的主子和奴才如何相处?[< csdn](https://blog.csdn.net/kuangyufei/article/details/108723672) [ | oschina >](https://my.oschina.net/u/3751245/blog/4646802)
### **基础篇**
* (汇编传参篇) | 汇编如何传递复杂的参数?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/113265990) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4927892)
* (时间管理篇) | Tick是操作系统的基本时间单位 [< csdn](https://blog.csdn.net/kuangyufei/article/details/113867785) [ | oschina >](https://my.oschina.net/weharmony/blog/4956163)
* (汇编基础篇) | CPU在哪里打卡上班 ?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/112986628) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4920361)
* (原子操作篇) | 是哪两条汇编指令在为原子操作保驾护航 ? [< csdn](https://blog.csdn.net/kuangyufei/article/details/113850603) [ | oschina >](https://my.oschina.net/weharmony/blog/4955290)
* (用栈方式篇) | 栈是构建底层运行的基础[< CSDN](https://blog.csdn.net/kuangyufei/article/details/112534331) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4893388)
* (定时器机制篇) | 内核最高优先级任务是谁???[< csdn](https://blog.csdn.net/kuangyufei/article/details/113774260) [ | oschina >](https://my.oschina.net/weharmony/blog/4951625)
* (位图管理篇) | 为何进程和线程都是32个优先级?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/112394982) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4888467)
* (用栈方式篇) | 栈是构建底层运行的基础[< csdn](https://blog.csdn.net/kuangyufei/article/details/112534331) [ | oschina >](https://my.oschina.net/u/3751245/blog/4893388)
* (源码结构篇) | 内核500问你能答对多少?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/111938348) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4869137)
* (位图管理篇) | 为何进程和线程都是32个优先级?[< csdn](https://blog.csdn.net/kuangyufei/article/details/112394982) [ | oschina >](https://my.oschina.net/u/3751245/blog/4888467)
* (源码注释篇) | 精读内核源码 深挖地基工程[< CSDN](https://blog.csdn.net/kuangyufei/article/details/109251754) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4686747)
* (源码结构篇) | 内核500问你能答对多少?[< csdn](https://blog.csdn.net/kuangyufei/article/details/111938348) [ | oschina >](https://my.oschina.net/u/3751245/blog/4869137)
* (双向链表篇) | 谁是内核最重要结构体?[< CSDN](https://blog.csdn.net/kuangyufei/article/details/108585659) [ | OSCHINA >](https://my.oschina.net/u/3751245/blog/4572304)
* (双向链表篇) | 谁是内核最重要结构体?[< csdn](https://blog.csdn.net/kuangyufei/article/details/108585659) [ | oschina >](https://my.oschina.net/u/3751245/blog/4572304)
### **主流站点**
感谢 `OSCHINA``CSDN``华为开发者论坛`, `51CTO`, `电子发烧友`,以及其他小伙伴通过自己的公众号对系列文章的转载和推荐,无以为报,唯有不断的深挖内核地基,输出更多文章,错漏之处请多见谅,会持续完善源码注解和文档内容,精雕细琢,尽全力打磨精品内容。文章输出站点:
感谢 `oschina``csdn``华为开发者论坛`, `51CTO`, `电子发烧友`,以及其他小伙伴通过自己的公众号对系列文章的转载和推荐,无以为报,唯有不断的深挖内核地基,输出更多文章,错漏之处请多见谅,会持续完善源码注解和文档内容,精雕细琢,尽全力打磨精品内容。文章输出站点:
**[CSDN |](https://blog.csdn.net/kuangyufei)** **[开源中国 |](https://my.oschina.net/weharmony)** **[51CTO |](https://harmonyos.51cto.com/column/34)** **[头条号 |](https://gitee.com/weharmony/docs/raw/master/pic/other/tt.png)** **[WeHarmony |](https://weharmony.gitee.io)** **[公众号](https://gitee.com/weharmony/docs/raw/master/pic/other/wxcode.png)**
**[csdn |](https://blog.csdn.net/kuangyufei)** **[开源中国 |](https://my.oschina.net/weharmony)** **[51cto |](https://harmonyos.51cto.com/column/34)** **[头条号 |](https://gitee.com/weharmony/docs/raw/master/pic/other/tt.png)** **[weharmony |](https://weharmony.gitee.io)** **[公众号](https://gitee.com/weharmony/docs/raw/master/pic/other/wxcode.png)**
## **Fork Me**
......@@ -178,9 +183,9 @@
---
百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新[< Gitee ](https://gitee.com/weharmony/kernel_liteos_a_note)[| Github ](https://github.com/kuangyufei/kernel_liteos_a_note)[| CSDN ](https://codechina.csdn.net/kuangyufei/kernel_liteos_a_note)[| Coding >](https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files)
百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新[< gitee ](https://gitee.com/weharmony/kernel_liteos_a_note)[| github ](https://github.com/kuangyufei/kernel_liteos_a_note)[| csdn ](https://codechina.csdn.net/kuangyufei/kernel_liteos_a_note)[| coding >](https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files)
百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,多站点每日同步更新[< OSCHINA ](https://my.oschina.net/u/3751245/blog/4626852)[| CSDN ](https://blog.csdn.net/kuangyufei/article/details/108727970)[| WeHarmony >](https://weharmony.gitee.io/)
百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,多站点每日同步更新[< oschina ](https://my.oschina.net/u/3751245/blog/4626852)[| csdn ](https://blog.csdn.net/kuangyufei/article/details/108727970)[| weharmony >](https://weharmony.gitee.io/)
......
/*
* Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _LOS_HW_PRI_H
#define _LOS_HW_PRI_H
#include "los_base.h"
#include "los_hw.h"
#include "los_process_pri.h"
#include "los_signal.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
#if defined(LOSCFG_ARCH_FPU_VFP_D16)
#define FP_REGS_NUM 16
#elif defined (LOSCFG_ARCH_FPU_VFP_D32)
#define FP_REGS_NUM 32
#endif
#define GEN_REGS_NUM 13
/* The size of this structure must be smaller than or equal to the size specified by OS_TSK_STACK_ALIGN (16 bytes). */
typedef struct {
#if !defined(LOSCFG_ARCH_FPU_DISABLE)
UINT64 D[FP_REGS_NUM]; /* D0-D31 */
UINT32 regFPSCR; /* FPSCR */
UINT32 regFPEXC; /* FPEXC */
#endif
UINT32 resved; /* It's stack 8 aligned */
UINT32 regPSR;
UINT32 R[GEN_REGS_NUM]; /* R0-R12 */
UINT32 SP; /* R13 */
UINT32 LR; /* R14 */
UINT32 PC; /* R15 */
} TaskContext;
typedef struct {
#if !defined(LOSCFG_ARCH_FPU_DISABLE)
UINT64 D[FP_REGS_NUM]; /* D0-D31 */
UINT32 regFPSCR; /* FPSCR */
UINT32 regFPEXC; /* FPEXC */
#endif
UINT32 resved;
TASK_IRQ_CONTEXT
} TaskIrqContext;
/*
* Description : task stack initialization
* Input : taskID -- task ID
* stackSize -- task stack size
* topStack -- stack top of task (low address)
* Return : pointer to the task context
*/
extern VOID *OsTaskStackInit(UINT32 taskID, UINT32 stackSize, VOID *topStack, BOOL initFlag);
extern VOID OsUserCloneParentStack(LosTaskCB *childTaskCB, LosTaskCB *parentTaskCB);
extern VOID OsUserTaskStackInit(TaskContext *context, TSK_ENTRY_FUNC taskEntry, UINTPTR stack);
extern void arm_clean_cache_range(UINTPTR start, UINTPTR end);
extern void arm_inv_cache_range(UINTPTR start, UINTPTR end);
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
#endif /* _LOS_HW_PRI_H */
/*
* Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _LOS_HW_PRI_H
#define _LOS_HW_PRI_H
#include "los_base.h"
#include "los_hw.h"
#include "los_process_pri.h"
#include "los_signal.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
#if defined(LOSCFG_ARCH_FPU_VFP_D16)
#define FP_REGS_NUM 16
#elif defined (LOSCFG_ARCH_FPU_VFP_D32)
#define FP_REGS_NUM 32
#endif
#define GEN_REGS_NUM 13
/* The size of this structure must be smaller than or equal to the size specified by OS_TSK_STACK_ALIGN (16 bytes). */
typedef struct {
#if !defined(LOSCFG_ARCH_FPU_DISABLE)
UINT64 D[FP_REGS_NUM]; /* D0-D31 */
UINT32 regFPSCR; /* FPSCR */
UINT32 regFPEXC; /* FPEXC */
#endif
UINT32 resved; /* It's stack 8 aligned */
UINT32 regPSR;
UINT32 R[GEN_REGS_NUM]; /* R0-R12 */
UINT32 SP; /* R13 */
UINT32 LR; /* R14 */
UINT32 PC; /* R15 */
} TaskContext;
typedef struct {//任务中断上下文
#if !defined(LOSCFG_ARCH_FPU_DISABLE)
UINT64 D[FP_REGS_NUM]; /* D0-D31 */
UINT32 regFPSCR; /* FPSCR */
UINT32 regFPEXC; /* FPEXC */
#endif
UINT32 resved;
TASK_IRQ_CONTEXT
} TaskIrqContext;
/*
* Description : task stack initialization
* Input : taskID -- task ID
* stackSize -- task stack size
* topStack -- stack top of task (low address)
* Return : pointer to the task context
*/
extern VOID *OsTaskStackInit(UINT32 taskID, UINT32 stackSize, VOID *topStack, BOOL initFlag);
extern VOID OsUserCloneParentStack(LosTaskCB *childTaskCB, LosTaskCB *parentTaskCB);
extern VOID OsUserTaskStackInit(TaskContext *context, TSK_ENTRY_FUNC taskEntry, UINTPTR stack);
extern void arm_clean_cache_range(UINTPTR start, UINTPTR end);
extern void arm_inv_cache_range(UINTPTR start, UINTPTR end);
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
#endif /* _LOS_HW_PRI_H */
......@@ -324,7 +324,7 @@ OsIrqFromKernel: @从内核发起中断
ADD SP, SP, #4 @sp = sp + 4
OsIrqContextRestore: @中断环境恢复
OsIrqContextRestore: @恢复硬中断环境
LDR R0, [SP, #(4 * 7)] @读取 SP+28 位置数据给R0
MSR SPSR_cxsf, R0 @恢复spsr
AND R0, R0, #CPSR_MASK_MODE
......
......@@ -190,7 +190,7 @@ _osExceptSwiHdl: @软中断异常处理
STMFD R3!, {R4} @ Save the CPSR and r15(pc) 保存LR寄存器
STMFD R3, {R13, R14}^ @ Save user mode r13(sp) and r14(lr) 保存用户模式下的SPLR寄存器
SUB SP, SP, #4
PUSH_FPU_REGS R1
PUSH_FPU_REGS R1 @保存中断模式(用户模式模式)
MOV FP, #0 @ Init frame pointer
CPSIE I @开中断,表明在系统调用期间可响应中断
......@@ -208,7 +208,7 @@ _osExceptSwiHdl: @软中断异常处理
LDMFD SP!, {R0-R12} @恢复R0-R12寄存器
LDMFD SP, {R13, R14}^ @ Restore user mode R13/R14 恢复用户模式的R13/R14寄存器
ADD SP, SP, #(2 * 4) @定位到保存旧PC值的位置
LDMFD SP!, {PC}^ @ Return to user 弹出值给PC寄存器
LDMFD SP!, {PC}^ @ Return to user 切回用户模式运行
OsKernelSVCHandler:
ADD R0, SP, #(4 * 16) @R0=sp+64
......
......@@ -161,7 +161,7 @@ VOID OsInterrupt(UINT32 intNum)//中断实际处理函数
*intCnt = *intCnt + 1;
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //开启查询系统CPU的占用率的中断
OsCpupIrqStart();//开始统计本次中断处理还是时间
OsCpupIrqStart();//记录本次中断处理开始时间
#endif
#ifdef LOSCFG_KERNEL_TICKLESS
......@@ -191,7 +191,7 @@ VOID OsInterrupt(UINT32 intNum)//中断实际处理函数
*intCnt = *intCnt - 1; //@note_why 这里没看明白为什么要 -1
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //开启查询系统CPU的占用率的中断
OsCpupIrqEnd(intNum);//结束统计本次中断处理还是时间
OsCpupIrqEnd(intNum);//记录中断处理时间完成时间
#endif
}
//申请内核空间拷贝硬中断参数
......
......@@ -112,7 +112,7 @@ __exception_handlers:
/* Startup code which will get the machine into supervisor mode */
.global reset_vector
.type reset_vector,function
reset_vector:
reset_vector: //鸿蒙开机代码
/* clear register TPIDRPRW */
mov r0, #0 @r0 = 0
mcr p15, 0, r0, c13, c0, 4 @c0,c13 = 0, C13为进程标识符 含义见 ARM720T.PDF 64
......
......@@ -623,7 +623,7 @@ void OsSaveSignalContext(unsigned int *sp)
SCHEDULER_UNLOCK(intSave);
}
//发生硬中断时,需保存用户态的用户栈现场,多了一个参数 R7寄存器
//汇编调用 见于 los_dispatch.S | 254行: BL OsSaveSignalContextIrq
//汇编调用 见于 los_dispatch.S | 254行: BL OsSaveSignalContextIrq
void OsSaveSignalContextIrq(unsigned int *sp, unsigned int r7)
{
UINTPTR sigHandler;
......@@ -632,14 +632,14 @@ void OsSaveSignalContextIrq(unsigned int *sp, unsigned int r7)
sig_cb *sigcb = NULL;
unsigned long cpsr;
UINT32 intSave;
TaskIrqContext *context = (TaskIrqContext *)(sp);
TaskIrqContext *context = (TaskIrqContext *)(sp);//汇编设置好SP位置
OS_RETURN_IF_VOID(sp == NULL);
cpsr = context->CPSR;
OS_RETURN_IF_VOID(((cpsr & CPSR_MASK_MODE) != CPSR_USER_MODE));//必须在用户模式下保存用户栈信息
SCHEDULER_LOCK(intSave);
task = OsCurrTaskGet();
task = OsCurrTaskGet(); //获取当前任务
process = OsCurrProcessGet();
sigcb = &task->sig;
if ((sigcb->context.count == 0) && ((sigcb->sigFlag != 0) || (process->sigShare != 0))) {
......@@ -656,9 +656,9 @@ void OsSaveSignalContextIrq(unsigned int *sp, unsigned int r7)
OsProcessExitCodeSignalSet(process, signo);
(VOID)memcpy_s(&sigcb->context.R0, sizeof(TaskIrqDataSize), &context->R0, sizeof(TaskIrqDataSize));//note_why 为何此处和OsSaveSignalContext的处理不一致?
sigcb->context.R7 = r7;
context->PC = sigHandler;
context->R0 = signo;
context->R1 = (UINT32)(UINTPTR)sigcb->sigunbinfo.si_value.sival_ptr;
context->PC = sigHandler;//入口函数
context->R0 = signo; //参数1
context->R1 = (UINT32)(UINTPTR)sigcb->sigunbinfo.si_value.sival_ptr;//参数2
/* sig No bits 00000100 present sig No 3, but 1<< 3 = 00001000, so signo needs minus 1 */
sigcb->sigFlag ^= 1ULL << (signo - 1);
sigcb->context.count++;
......
......@@ -40,20 +40,21 @@ LITE_USER_SEC_RODATA STATIC CHAR *g_initPath = "/bin/init";//由Init_lite在编
//将 sys_call3 链接在 section(".user.text")段
LITE_USER_SEC_TEXT STATIC UINT32 sys_call3(UINT32 nbr, UINT32 parm1, UINT32 parm2, UINT32 parm3)
{
register UINT32 reg7 __asm__("r7") = (UINT32)(nbr); //给寄存器直接赋值
register UINT32 reg2 __asm__("r2") = (UINT32)(parm3);
register UINT32 reg1 __asm__("r1") = (UINT32)(parm2);
register UINT32 reg0 __asm__("r0") = (UINT32)(parm1);
register UINT32 reg7 __asm__("r7") = (UINT32)(nbr); //系统调用号给了R7寄存器
register UINT32 reg2 __asm__("r2") = (UINT32)(parm3);//R2 = 参数3
register UINT32 reg1 __asm__("r1") = (UINT32)(parm2);//R1 = 参数2
register UINT32 reg0 __asm__("r0") = (UINT32)(parm1);//R0 = 参数1
//SVC指令会触发一个“特权调用”异常。这为非特权软件调用操作系统或其他只能在PL1级别访问的系统组件提供了一种机制。
__asm__ __volatile__
(
"svc %1" //管理模式(svc) [10011]:操作系统使用的保护模式
: "=r"(reg0)
: "=r"(reg0) //输出寄存器为R0
: "i"(SYS_CALL_VALUE), "r"(reg7), "r"(reg0), "r"(reg1), "r"(reg2)
: "memory", "r14"
);
return reg0;
//相当于执行了 reset_vector_mp.S 中的 向量表0x08对应的 _osExceptSwiHdl
return reg0;//reg0的值将在汇编中改变.
}
LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args)
......
......@@ -463,7 +463,7 @@ VOID HalIrqHandler(VOID)
}
g_curIrqNum = vector;//记录当前中断号
OsInterrupt(vector);
OsInterrupt(vector);//处理中断
GiccSetEoir(vector);
}
//获取中断控制器版本
......
......@@ -56,7 +56,7 @@ IPC实现方式之消息队列:
鸿蒙liteos 支持POSIX消息队列并加入了一种自研的消息队列 liteipc,此处重点讲 posix消息队列
********************************************************/
//打开一个消息队列,封装了posix接口
//打开一个消息队列,由posix接口封装
mqd_t SysMqOpen(const char *mqName, int openFlag, mode_t mode, struct mq_attr *attr)
{
mqd_t ret;
......
......@@ -98,6 +98,7 @@ void SyscallHandleInit(void)
SYSCALL是产生系统调用时触发的信号,R7寄存器存放具体的系统调用ID,也叫系统调用号
regs:参数就是所有寄存器
注意:本函数在用户态和内核态下都可能被调用到
//MOV R0, SP @获取SP值,R0将作为OsArmA32SyscallHandle的参数
******************************************************************/
LITE_OS_SEC_TEXT UINT32 *OsArmA32SyscallHandle(UINT32 *regs)
{
......@@ -124,8 +125,8 @@ LITE_OS_SEC_TEXT UINT32 *OsArmA32SyscallHandle(UINT32 *regs)
regs[REG_R0] = -ENOSYS;
return regs;
}
//regs[0-6] 记录系统调用的参数
switch (nArgs) {
//regs[0-6] 记录系统调用的参数,这也是由R7寄存器保存系统调用号的原因
switch (nArgs) {//参数的个数
case ARG_NUM_0:
case ARG_NUM_1:
ret = (*(SyscallFun1)handle)(regs[REG_R0]);//执行系统调用,类似 SysUnlink(pathname);
......@@ -139,13 +140,12 @@ LITE_OS_SEC_TEXT UINT32 *OsArmA32SyscallHandle(UINT32 *regs)
ret = (*(SyscallFun5)handle)(regs[REG_R0], regs[REG_R1], regs[REG_R2], regs[REG_R3],
regs[REG_R4]);
break;
default:
default: //7个参数的情况
ret = (*(SyscallFun7)handle)(regs[REG_R0], regs[REG_R1], regs[REG_R2], regs[REG_R3],
regs[REG_R4], regs[REG_R5], regs[REG_R6]);
}
regs[REG_R0] = ret;//R0保存系统调用返回值
OsSaveSignalContext(regs);//保存用户栈现场
/* Return the last value of curent_regs. This supports context switches on return from the exception.
......
git add -A
git commit -m '硬中断汇编代码注解
git commit -m '热爱是所有的理由和答案
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://weharmony.gitee.io
'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册