鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的

精读内核源码就绕不过汇编语言,鸿蒙内核有6个汇编文件,读不懂它们就真的很难理解以下问题.

1.系统调用是如何实现的?

2.CPU是如何切换任务和进程上下文的?

3.硬件中断是如何处理的?

4.main函数到底是怎么来的?

5.开机最开始发生了什么?

6.关机最后的最后又发生了什么?

以下是一个很简单的C文件编译成汇编代码后的注解. 读懂这些注解会发现汇编很可爱,甚至还会上瘾,并没有想象中的那么恐怖,读懂它会颠覆你对汇编和栈的认知.

#include <stdio.h>
#include <math.h>int square(int a,int b){return a*b;
}int fp(int b)
{int a = 1;return square(a+b,a+b);
}int main()
{int sum = 1;for(int a = 0;a < 100; a++){sum = sum + fp(a);}return sum;
}

//编译器: armv7-a clang (trunk)
square(int, int):sub     sp, sp, #8     @sp减去8,意思为给square分配栈空间,只用2个栈空间完成计算str     r0, [sp, #4]   @第一个参数入栈str     r1, [sp]       @第二个参数入栈ldr     r1, [sp, #4]   @取出第一个参数给r1ldr     r2, [sp]       @取出第二个参数给r2mul     r0, r1, r2     @执行a*b给R0,返回值的工作一直是交给R0的add     sp, sp, #8     @函数执行完了,要释放申请的栈空间bx      lr             @子程序返回,等同于mov pc,lr,即跳到调用处
fp(int):push    {r11, lr}      @r11(fp)/lr入栈,保存调用者main的位置mov     r11, sp        @r11用于保存sp值,函数栈开始位置 sub     sp, sp, #8     @sp减去8,意思为给fp分配栈空间,只用2个栈空间完成计算str     r0, [sp, #4]   @先保存参数值,放在SP+4,此时r0中存放的是参数mov     r0, #1         @r0=1str     r0, [sp]       @再把1也保存在SP的位置ldr     r0, [sp]       @把SP的值给R0ldr     r1, [sp, #4]   @把SP+4的值给R1add     r1, r0, r1     @执行r1=a+bmov     r0, r1         @r0=r1,用r0,r1传参bl      square(int, int)@先mov lr, pc 再mov pc square(int, int)   mov     sp, r11        @函数执行完了,要释放申请的栈空间 pop     {r11, lr}      @弹出r11和lr,lr是专用标签,弹出就自动复制给lr寄存器bx      lr             @子程序返回,等同于mov pc,lr,即跳到调用处
main:push    {r11, lr}      @r11(fp)/lr入栈,保存调用者的位置mov     r11, sp        @r11用于保存sp值,函数栈开始位置sub     sp, sp, #16    @sp减去8,意思为给main分配栈空间,只用2个栈空间完成计算mov     r0, #0         @初始化r0str     r0, [r11, #-4] @作用是保存SUM的初始值 str     r0, [sp, #8]   @sum将始终占用SP+8的位置str     r0, [sp, #4]   @a将始终占用SP+4的位置b       .LBB1_1        @跳到循环开始位置
.LBB1_1:                       @循环开始位置入口ldr     r0, [sp, #4]   @取出a的值给r0cmp     r0, #99        @跟99比较bgt     .LBB1_4        @大于99,跳出循环 mov pc .LBB1_4b       .LBB1_2        @继续循环,直接 mov pc .LBB1_2
.LBB1_2:                       @符合循环条件入口ldr     r0, [sp, #8]   @取出sum的值给r0,sp+8用于写SUM的值str     r0, [sp]       @先保存SUM的值,SP的位置用于读SUM值ldr     r0, [sp, #4]   @r0用于传参,取出A的值给r0作为fp的参数bl      fp(int)        @先mov lr, pc再mov pc fp(int)mov     r1, r0         @fp的返回值为r0,保存到r1ldr     r0, [sp]       @取出SUM的值add     r0, r0, r1     @计算新sum的值,由R0保存str     r0, [sp, #8]   @将新sum保存到SP+8的位置b       .LBB1_3        @无条件跳转,直接 mov pc .LBB1_3
.LBB1_3:                       @完成a++操作入口ldr     r0, [sp, #4]   @SP+4中记录是a的值,赋给r0add     r0, r0, #1     @r0增加1str     r0, [sp, #4]   @把新的a值放回SP+4里去b       .LBB1_1        @跳转到比较 a < 100 处
.LBB1_4:                       @循环结束入口ldr     r0, [sp, #8]   @最后SUM的结果给R0,返回值的工作一直是交给R0的mov     sp, r11        @函数执行完了,要释放申请的栈空间pop     {r11, lr}      @弹出r11和lr,lr是专用标签,弹出就自动复制给lr寄存器bx      lr             @子程序返回,跳转到lr处等同于 MOV PC, LR

这个简单的汇编并不是鸿蒙的汇编,只是先打个底,由浅入深, 但看懂了它基本理解鸿蒙汇编代码没有问题, 后续将详细分析鸿蒙内核各个汇编文件的作用.
开始分析上面的汇编代码.

第一: 上面的代码和鸿蒙内核用栈方式一样,都采用了递减满栈的方式, 什么是递减满栈? 递减指的是栈底地址高于栈顶地址,满栈指的是SP指针永远在栈顶.一定要理解递减满栈,否则读不懂内核汇编代码.举例说明:

square(int, int):sub     sp, sp, #8     @sp减去8,意思为给square分配栈空间,只用2个栈空间完成计算str     r0, [sp, #4]   @第一个参数入栈str     r1, [sp]       @第二个参数入栈ldr     r1, [sp, #4]   @取出第一个参数给r1ldr     r2, [sp]       @取出第二个参数给r2mul     r0, r1, r2     @执行a*b给R0,返回值的工作一直是交给R0的add     sp, sp, #8     @函数执行完了,要释放申请的栈空间bx      lr             @子程序返回,等同于mov pc,lr,即跳到调用处

首句汇编的含义就是申请栈空间, sp = sp - 8 ,一个栈内单元(栈空间)占4个字节,申请2个栈空间搞定函数的计算,仔细看下代码除了在函数的末尾 sp = sp + 8 又恢复在之前的位置的中间过程,SP的值是没有任务变化,它的指向是不动的, 这跟很多人对栈的认知是不一样的,它只是被用于计算,例如
ldr r1, [sp, #4] 的意思是取出SP+4这个虚拟地址的值给r1寄存器,SP的值并没有改变的,为什么要+呢,因为SP是指向栈顶的,地址是最小的. 满栈就是用栈过程中对地址的操作不能超过SP,所以你很少在计算过程中看到 把sp-4地址中的值给某个寄存器, 除非是特别的指令,否则不可能有这样的指令.

第二: sub sp, sp, #8 和 add sp, sp, #8 是成对出现的,这就跟申请内存,释放内存的道理一样,这是内核对任务的运行栈管理方式,一样用多少申请多少,用完释放.空间大小就是栈帧,这是栈帧的本质含义.

第三: push {r11, lr} 和 pop {r11, lr} 也是成对出现的,主要是用于函数调用,例如 A -> B, B要保存A的栈帧范围和指令位置, lr保存是是A函数执行到哪个指令的位置, r11干了fp的工作,其实就是指向 A的栈顶位置,如此B执行完后return回A的时候,先mov pc,lr 内核就知道改执行A的哪条指令了,同时又知道了A的栈顶位置.

第四: 频繁出现的R0寄存器的作用用于传参和返回值, A调用B之前,假如有两个参数,就把参数给r0 ,r1记录,充当了A的变量, 到了B中后,先让 r0,r1入栈,目的是保存参数值, 因为 B中要用r0,r1 ,他们变成B的变量用了. 返回值都是默认统一给r0保存. B中将返回值给r0,回到A中取出R0值对A来说这就是B的返回值.

这是以上为汇编代码的分析,追问两个问题

第一:如果是可变参数怎么办? 100个参数怎么整, 通过寄存器总共就12个,不够传参啊
第二:返回值可以有多个吗?

也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线。大家可以进行参考学习:https://qr21.cn/FV7h05

①全方位,更合理的学习路径
路线图包括ArkTS基础语法、鸿蒙应用APP开发、鸿蒙能力集APP开发、次开发多端部署开发、物联网开发等九大模块,六大实战项目贯穿始终,由浅入深,层层递进,深入理解鸿蒙开发原理!

②多层次,更多的鸿蒙原生应用
路线图将包含完全基于鸿蒙内核开发的应用,比如一次开发多端部署、自由流转、元服务、端云一体化等,多方位的学习内容让学生能够高效掌握鸿蒙开发,少走弯路,真正理解并应用鸿蒙的核心技术和理念。

③实战化,更贴合企业需求的技术点
学习路线图中的每一个技术点都能够紧贴企业需求,经过多次真实实践,每一个知识点、每一个项目,都是码牛课堂鸿蒙研发团队精心打磨和深度解析的成果,注重对学生的细致教学,每一步都确保学生能够真正理解和掌握。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:https://qr21.cn/FV7h05

如何快速入门:

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr21.cn/FV7h05

大厂鸿蒙面试题::https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Allegro画PCB中如何旋转器件

PCB中如何旋转器件 鼠标点击器件&#xff0c;然后右击&#xff0c;选择“Rotate”&#xff0c;然后再“Options”里选择旋转的角度和旋转中心&#xff0c;如下图&#xff1a; 然后鼠标转动就可以转动器件了。

数据结构——时间复杂度与空间复杂度

文章目录 一、算法效率算法的复杂度 二、时间复杂度1.时间复杂度的概念2.大O的渐进表示法3.例子 三、空间复杂度1.空间复杂度概念2.例子 四、常见复杂度对比 一、算法效率 算法的复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源 。 因此…

【算法刷题 | 贪心算法07】4.29(用最少数量的箭引爆气球、无重叠区间)

文章目录 12.用最少数量的箭引爆气球12.1题目12.2解法&#xff1a;贪心12.2.1贪心思路12.2.2代码实现 13.无重叠区间13.1题目13.2解法&#xff1a;贪心13.2.1贪心思路13.2.2代码实现 12.用最少数量的箭引爆气球 12.1题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面…

python可视化图表

1.测试数据准备 2011年1月销售数据.txt 2011-01-01,4b34218c-9f37-4e66-b33e-327ecd5fb897,1689,湖南省 2011-01-01,5b6a6417-9a16-4243-9704-255719074bff,2353,河北省 2011-01-01,ae240260-68a9-4e59-b4c9-206be4c08a8d,2565,湖北省 2011-01-02,c833e851-880f-4e05-9de5-b5…

Flutter 有什么优异特性和革命性创新之处?

Flutter 有什么优异特性和革命性创新之处? 什么是 Flutter&#xff1f; Flutter mobile app SDK是一种新的方式来构建漂亮的原生移动应用程序&#xff0c;摆脱过去常见的“千篇一律”的应用程序。用过Flutter的人都对它赞赏有加&#xff1b; 相比较其他新型系统&#xff0c…

如何用揿针治疗慢性咽炎?

点击文末领取揿针的视频教程跟直播讲解 在日常生活中&#xff0c;慢性咽炎极为常见&#xff0c;不致命却很恼人。一旦发作&#xff0c;你的喉咙每天都会不舒服&#xff0c;总感觉有东西堵着&#xff0c;但是呢&#xff0c;咳又咳不出来&#xff0c;咽也咽不下去&#xff0c;你…

五一劳动节,祝你劳动快乐,休息更快乐!

五一国际劳动节亦称“五一节”&#xff0c;在每年的五月一日。此节源于美国芝加哥城的工人大罢工。Labour Day also known as "51" on May 1 of each year.This section comes from the city of Chicago workers strike. 1886年5月1日&#xff0c;芝加哥的二十一万六…

opencv_23_高斯模糊

void ColorInvert::gaussian_blur(Mat& image) { Mat dst; GaussianBlur(image, dst, Size(0, 0), 15); // Size(2, 2), imshow("图像模糊2", dst); }

最新CRM系统评测:发现双重功能的好用客户关系管理系统

对于绝大多数企业来说&#xff0c;拥有强大的销售能力是实现增长、获得收益的关键。在如今企业数字化的大背景下&#xff0c;我们经常会听到关于自动化的讨论&#xff0c;也有声音会说&#xff0c;企业数字化成功与否的标准之一就是自动化程度。销售自动化&#xff08;SFA&…

集成框架 -- OSS

前言 接入oss必须有这两个文档基础 使用STS临时访问凭证访问OSS_对象存储(OSS)-阿里云帮助中心 前端上传跨域 正文 sts前后端通用&#xff0c;开通图示 AliyunSTSAssumeRoleAccess 后端实现代码 public static void main(String[] args) {String regionId "cn-ha…

Emby Notifier——一个媒体通知推送服务

Emby Notifier 这是另一个项目 watchdog_for_Emby 的最新优化版本&#xff0c;取消了 nfo 文件的监视依赖&#xff0c;该版本不再需要手动设置媒体库路径&#xff0c;对通过网盘挂载生成的媒体库更加友好~ Emby Server 版本 (重要&#xff01;&#xff01;&#xff01;) 4.8.0…

【会员单位】浙江晧月水务科技有限公司

中华环保联合会理事单位 水环境治理专业委员会副主任委员单位 公司成立于2018年3月14日&#xff0c;是专业研究废水处理业务的国家高新技术企业。 公司自主研发的脱硫废水“零排放”的技术&#xff0c;不仅适应性好&#xff0c;技术先进&#xff0c;智慧化程度高&#xff0c…

Leetcode—1041. 困于环中的机器人【中等】

2024每日刷题&#xff08;121&#xff09; Leetcode—1041. 困于环中的机器人 实现代码 class Solution { public:bool isRobotBounded(string instructions) {int x 0;int y 0;int d 0;vector<vector<int>> direction{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};for…

网络安全主题纪录片

网络安全主题纪录片 文章目录 网络安全主题纪录片第四公民黑客帝国系列龙纹身女孩碟中谍系列虎胆龙威4匿名者终结者2&#xff1a;审判日东方快车谋杀案黑客国家公敌我是谁&#xff1a;没有绝对安全的系统黑客军团速度与激情系列十亿美元大劫案勒索软件的背后黑客的恐惧为什么网…

Python实用记录(十六):PyQt/PySide6联动VSCode便捷操作指南

文章目录 一、安装vscode和配置pyside6环境二、安装vscode扩展三、扩展配置编辑四、编辑运行 一、安装vscode和配置pyside6环境 这一步默认已经通过了 二、安装vscode扩展 三、扩展配置编辑 四个地方需要修改&#xff1b;rcc路径、uic路径、designer.exe路径 uic.exe 用于将…

基于Docker + Locust的数据持久化性能测试系统

前几天给大家分享了如何使用Locust进行性能测试&#xff0c;但是在实际使用中会发现存在压测的结果无法保存的问题&#xff0c;比如在分布式部署情况下进行压测&#xff0c;每轮压测完成需要释放资源删除容器重新部署后&#xff0c;这段时间的压测结果就都丢失了&#xff0c;如…

Oracle 表分区

1.概述 分区表就是将表在物理存储层面分成多个小的片段&#xff0c;这些片段即称为分区&#xff0c;每个分区保存表的一部分数据&#xff0c;表的分区对上层应用是完全透明的&#xff0c;从应用的角度来看&#xff0c;表在逻辑上依然是一个整体。 目的&#xff1a;提高大表的查…

信息收集。

信息收集 接着使用cs进行信息收集 发现域内管理员账号。 然后查看pc信息&#xff0c; 查看进程。 发现域为god.org 尝试定位域控。 提权 使用cs的功能进行权限提权 成功获取管理员权限。 hash抓取 接着抓hash 成功抓到管理员账号、密码。 接着进行横向传递 成功获取AD和…

React的数据Mock实现

在前后端分类的开发模式下&#xff0c;前端可以在没有实际后端接口的支持下先进行接口数据的模拟&#xff0c;进行正常的业务功能开发 1. 常见的Mock方式 2. json-server实现Mock 实现步骤&#xff1a; 项目中安装json-server npm i -D json-server准备一个json文件 {"…

计算机毕业设计python基于django框架的网上拍卖系统

创新点&#xff1a;本系统采用英国式拍卖和荷兰式拍卖两种模式&#xff0c;英国式拍卖也叫升价拍卖。这是最普遍的一种拍卖方式。拍卖人设定一个底价&#xff0c;竞买人相继给出更高的价格&#xff0c;最终出价最高者胜出&#xff0c;并支付最高价。这种形式在电影中非常常见&a…