0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙内核源码分析:鸿蒙内核的每段汇编代码解析

鸿蒙系统HarmonyOS 来源:百家号 作者:计算机java编程 2021-03-02 09:56 次阅读

本篇说清楚CPU的工作模式

读本篇之前建议先读鸿蒙内核源码分析(总目录)其他篇.

正如一个互联网项目的后台管理系统有权限管理一样,CPU工作是否也有权限(模式)? 一个成熟的软硬件架构,肯定会有这些设计,只是大部分人不知道,也不需要知道,老百姓就干好老百姓的活就行了,有工作能吃饱饭就知足了,宫的事你管那么多干嘛,你也管不了.

应用程序就只关注应用功能,业务逻辑相关的部分就行了,底层实现对应用层屏蔽的越干净系统设计的就越优良.

但鸿蒙内核源码分析系列篇的定位就是要把整个底层解剖,全部掰开,看看宫里究竟发生了么事.从本篇开始要接触大量的汇编的代码,将鸿蒙内核的每段汇编代码一一说明白.如此才能知道最开始的开始发生了什么,最后的最后又发生了什么.

七种模式

先看一张图,图来源于ARM720T.pdf第43页,在ARM体系中,CPU工作在以下七种模式中:

o4YBAGA9mhqAITVgAAKa3KWMsqU730.png

用户模式(usr):属于正常的用户模式,ARM处理器正常的程序执行状态。快速中断模式(fiq):用于处理快速中断,对高速数据传输或通道处理外部中断模式(irq):对一般情况下的中断进行处理。管理模式(svc):属于操作系统使用的保护模式,处理软件中断swi reset。数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于处理存储器故障、实现虚拟存储器和存储器保护。系统模式(sys):运行具有特权的操作系统任务。未定义指令中止模式(und):处理未定义的指令陷阱,当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。除了用户模式外,其它六种均为特权模式或者叫异常模式。每种模式都有自己独立的入口和独立的运行栈空间.系列篇之CPU篇已介绍过只要提供了入口函数和运行空间,CPU就可以干活了.入口函数解决了指令来源问题,运行空间解决了指令的运行问题. 而且在多核情况下,每个CPU核的每种异常模式都有自己独立的栈空间.注意是异常模式下的栈空间,用户模式的栈空间是由用户(应用)程序提供的.

如何让这七种模式能流畅的跑起来呢? 至少需要以下解决三个基本问题.

栈空间是怎么申请的?申请了多大?被切换中的模式代码放在哪里?谁来安排它们放在哪里?模式之间是怎么切换的?状态怎么保存?本篇代码来源于鸿蒙内核源码之reset_vector_mp.S,点击查看 这个汇编文件大概 500多行,非常重要,本篇受限于篇幅只列出一小部分,说清楚以上三个问题.系列其余篇中将详细说明每段汇编代码的作用和实现,可前往查阅.

1.异常模式栈空间怎么申请?

鸿蒙是如何给异常模式申请栈空间的

代码解读

六种异常模式都有自己独立的栈空间每种模式的OS_EXC_***_STACK_SIZE栈大小都不一样,最大是管理模式(svc)8K,最小的只有40个字节. svc模式为什么要这么大呢? 因为开机代码和系统调用代码的运行都在管理模式,系统调用的函数实现往往较复杂,最大不能超过8K. 例如:某个系统调用中定义一个8K的局部变量,内核肯定立马闪蹦.因为栈将溢出,处理异常的程序出现了异常,后面就再也没人兜底了,只能是死局.鸿蒙是支持多核处理的,CORE_NUM表明,每个CPU核的每种异常模式都有自己的独立栈空间.注意理解这个是理解内核代码的基础.否则会一头雾水.2.异常模式入口地址在哪?

再看一张图,图来源于ARM720T.pdf第56页

o4YBAGA9mlWAfm2AAAIRJFlZYII637.png

这就是一切一切的开始,指定所有异常模式的入口地址表,这就是规定,没得商量的.在低地址情况下.开机代码就是放在0x00000000的位置,触发开机键后,硬件将PC寄存器置为0x00000000,开始了万里长征的第一步.在系统运行过程中就这么来回跳.

以上是各个异常情况下的入口地址,在reset_vector_mp.S中都能找到,经过编译链接后就会变成

不管是主动切换的异常,还是被动切换的异常,都会先跳到对应的入口去处理.每个异常的代码都起始于汇编,处理完了再切回去.举个例子: 某个应用程序调用了系统调用(比如创建定时器),会经过以下大致过程:

swi指令将用户模式切换到管理模式(svc)在管理模式中先保存用户模式的现场信息(R0-R15寄存器值入栈)获取系统调用号,知道是调用了哪个系统调用查询系统调用对应的注册函数执行真正的创建定时器函数执行完成后,恢复用户模式的现场信息(R0-R15寄存器值出栈)跳回用户模式继续执行各异常处理代码很多,不一一列出,本篇只列出开机代码,请尝试读懂鸿蒙内核开机代码,后续讲详细说明每行代码的用处.

开机代码

异常的权限

当同时出现多个异常时,该响应哪一个呢?就涉及到了异常的权限,如下

Reset (highest priority).Data Abort.FIQ.IRQ.Prefetch Abort.Undefined Instruction, SWI (lowest priority).可以看出swi的权限最低,swi就是软件中断,系统调用就是通过它来实现的.

3.异常模式怎么切换?

写应用程序经常会用到状态,来记录各种分支逻辑,传递参数.这么多异常模式,相互切换,中间肯定会有很多的状态需要保存.比如:如何能知道当前运行在哪种模式下?怎么查?去哪里查呢? 答案是: CPSR 和 SPSR CPSR:程序状态寄存器(current program status register) (当前程序状态寄存器),在任何处理器模式下被访问。 SPSR:程序状态保存寄存器(saved program status register),每一种处理器模式下都有一个状态寄存器SPSR,SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。当特定 的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。

这些寄存器:

保存有关最近执行的ALU操作的信息控制中断的启用和禁用设置处理器操作模式

o4YBAGA9mqyAfg-xAAKGLUkpyBY428.png


编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117719
  • 定时器
    +关注

    关注

    23

    文章

    3147

    浏览量

    112036
收藏 人收藏

    评论

    相关推荐

    鸿蒙内核源码Task/线程技术分析

    前言 在鸿蒙内核中,广义上可理解为一个Task就是一个线程 一、怎么理解Task 1. 官方文档是怎么描述线程 基本概念 从系统的角度看,线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU
    的头像 发表于 10-18 10:42 1948次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>内核</b><b class='flag-5'>源码</b>Task/线程技术<b class='flag-5'>分析</b>

    鸿蒙内核源码分析:用通俗易懂的语言告诉你鸿蒙内核发生了什么?

    查看。内存在内核的比重极大内存模块占了鸿蒙内核约15%代码量, 近50个文件,非常复杂。鸿蒙源码
    发表于 11-19 10:14

    鸿蒙内核源码分析源码注释篇):给HarmonyOS源码逐行加上中文注释

    源码分析(总目录) 查看,两大站点持续更新注释中文版 进入>> 鸿蒙内核源码注释中文版 【 Gitee仓】阅读,三大仓库每日同步更新…加注释
    发表于 11-19 10:32

    鸿蒙内核源码分析:给HarmonyOS源码逐行加上中文注释

    原文链接:https://bbs.elecfans.com/jishu_2010058_1_1.html 每个码农,职业生涯,都应精读一遍内核源码. 鸿蒙内核
    发表于 11-19 15:06

    鸿蒙源码分析系列(总目录) | 给HarmonyOS源码逐行加上中文注释

    注解|-鸿蒙内核源码分析(内存映射篇) | 虚拟内存和物理内存之间是怎么映射的|-鸿蒙内核
    发表于 11-20 11:24

    鸿蒙内核源码分析(必读篇):用故事说内核

    本文基于开源鸿蒙内核分析,官方源码【kernel_liteos_a】官方文档【docs】参考文档【Huawei LiteOS】本文作者:鸿蒙
    发表于 11-23 10:15

    鸿蒙内核源码分析(调度机制篇):Task是如何被调度执行的

    认任务上下文!这里看不到任何代码了,因为这是跟CPU相关的,不同的CPU需要去适配不同的汇编代码,所以这些汇编代码不会出现在一个通用工程中。
    发表于 11-23 10:53

    鸿蒙内核源码分析(双循环链表篇) :内核最重要结构体

    鸿蒙源码分析系列文章图解鸿蒙内核, 从 HarmonyOS 架构层视角整理成文, 并首创用生活场景讲故事的方式试图去解构
    发表于 11-24 13:39

    鸿蒙内核源码分析(必读篇)

    本文基于开源鸿蒙内核分析,官方源码【kernel_liteos_a】官方文档【docs】参考文档【Huawei LiteOS】本文作者:鸿蒙
    发表于 11-25 09:28

    HarmonyOS内核源码分析(上)电子书-上线了

    `为方便大家开发鸿蒙系统,小编为大家编辑整理了一本HarmonyOS内核源码分析系列电子书,需要参考学习的朋友快来下吧!本电子书主要介绍如何给鸿蒙
    发表于 11-25 17:13

    鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核)

    致敬内核开发者感谢开放原子开源基金会,致敬鸿蒙内核开发者。可以毫不夸张的说鸿蒙内核源码可作为大学
    发表于 07-04 17:16

    为何要精读鸿蒙内核源码?

    一个没学过计算机知识的卖菜大妈就不可能知道内核的基本运作了吗? 不一定!在系列篇中试图用 鸿蒙内核源码分析(总目录)之故事篇 去引导这一层级
    的头像 发表于 04-26 15:00 1455次阅读
    为何要精读<b class='flag-5'>鸿蒙</b><b class='flag-5'>内核</b><b class='flag-5'>源码</b>?

    浅谈鸿蒙内核源码的栈

    上面的代码鸿蒙内核用栈方式一样,都采用了递减满栈的方式, 什么是递减满栈?
    的头像 发表于 04-24 11:21 1111次阅读
    浅谈<b class='flag-5'>鸿蒙</b><b class='flag-5'>内核</b><b class='flag-5'>源码</b>的栈

    鸿蒙内核源码分析内核最重要结构体

    为何鸿蒙内核源码分析系列开篇就说 LOS_DL_LIST ? 因为它在鸿蒙 LOS 内核中无处
    发表于 11-24 17:54 35次下载
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>内核</b><b class='flag-5'>源码</b><b class='flag-5'>分析</b> :<b class='flag-5'>内核</b>最重要结构体

    华为鸿蒙系统内核源码分析上册

    鸿蒙內核源码注释中文版【 Gitee仓】给 Harmoηy○S源码逐行加上中文注解,详细阐述设计细节,助你快速精读 Harmonyos内核源码
    发表于 04-09 14:40 16次下载