理论学习-ARM-内核

ARM内核

为了提高学习效率,我们要提前想好学习策略。
首先,使用频率越高的知识点,越要首先学习。假使,我们学习了一个知识点,能覆盖工作中80%的工作量,那是不是很夸张的学习效率?!
其次,有两种覆盖知识点,梳理知识点的策略。一种是将知识按体系划分,挨个学习,系统学习。具体而形象的学习样板就是教科书。第一章,第二章等等,挨个分支学习、梳理。如果我们要讲述应题的知识,就要按寄存器、计算机工作原理、汇编指令、内核架构分体系去挨个讲解。还有一种策略就是面对问题。比如,我们首先提出一个问题:"函数调用,从C语言到汇编,再到CPU内核,以及寄存器的工作表现是怎样实现的",如果我们把这个问题讲解清楚,就要把各个牵涉的体系知识揉到一起讲解。第二种策略,似乎更能把使用频率高的知识点串一起,一起学习。是我们面对工程应用更好的学习策略。因为我们不是做研究啊!如果,我们用第二种工作策略,感觉收益不大了(因为使用频率低的,这种学习方式我们不易接触到,无法高效率补充知识盲点)。那么我们就应该更换第一种学习策略了,补充知识盲点,系统学习,系统梳理。

ok,我们采用第二种策略开始学习。

函数的调用

要实现函数调用,有至少要有四步:

  1. 压栈,保护当前函数现场。
  2. 跳转,实现函数跳转。
    a. 读参数
    b. 运算、运行
    c. 返回结果
  3. 跳转,返回父级函数。
  4. 出栈,恢复现场。

用实例,来对应感受一下。

对应的汇编


可见,套路既是:

  1. 压栈,保护当前函数现场。 { PUSH 或者 LDR } sp寄存器,Rx寄存器

  2. 跳转,实现函数跳转。{B、BL、BX},对应给PC寄存器赋值

a. 读参数 (出栈【从栈读取】、或者R0、R1)

b. 运算、运行 (ADD等)

c. 返回结果(压栈【从栈保存】,或者R0、R1)

  1. 跳转,返回父级函数。{B、BL、BX ,但对应LR}, 对应给PC寄存器赋值

  2. 出栈,恢复现场。{POP 或者LDR}, sp寄存器,Rx寄存器

【注意】:

  1. 跳转前保存下一条指令地址至LR寄存器

不带返回的跳转指令B, 不会保存地址至LR寄存器

带返回的跳转指令BL,会自动保存地址至LR寄存器

  1. 在子函数不会自动跳回父函数,需要手动将LR寄存器的值赋给PC寄存器才能跳转回来。

  2. 有一个官方规范AAPCS(Procedure Call Standard for the ARM® Architecture),详细描述了进行函数调用时如何进行参数的传递和调用路径的记录等。

  3. 大多数的函数调用通过BL语句实现,对应着LR寄存器 和 PC寄存器。因此依次找到栈中LR的数值,就能找到调用路径中各个函数的地址。最后根据map文件翻译出各函数的名称,就可以得到函数的调用路径了。【栈回溯】

  4. 寄存器概述

  • 通用寄存器
    通用寄存器中可供挖掘的信息并不多,通常情况下r0-r3寄存器保存着函数的前四个参数(其余的参数在栈中保存),需要注意的是:这四个寄存器的数值仅在函数开始执行的时候是可靠的,在函数执行的过程中可能被改变。在函数返回时,寄存器r0和r1用于保存返回值(根据返回数据的大小,决定仅使用r0还是同时使用r0和r1)。同样这两个寄存器仅在子函数刚返回时数值才是可靠的。
  • 特殊功能寄存器【PC、LR和SP】
    SP指向当前的栈顶,在知晓栈的结构时,可以根据SP访问栈中的数据。
    在中断处理函数中LR有特殊用法,其中保存了返回被中断地点的方法,而不是通常情况下的返回地址。因此在Hardfault处理函数中寄存器LR和PC的值没有太多参考意义,被处理器自动压栈的LR和PC最有用,PC记录了被中断打断前正在执行的指令地址(也是正在执行的函数地址),LR记录了被中断打断前,正在执行的函数的父函数的地址。根据这两个地址,可以找到引发Hardfault异常的函数和语句,以及其父函数(如果辅以汇编代码继续对栈的内容进行分析,则可以回溯整个调用路径)。
  • SCB寄存器
    在M3/M4处理器标准外设中,有一个叫做SCB(System Control Block)的部分,其中有6个寄存器记录了发生Hardfault异常的原因。
    --此部分转载至 【作者:电工王大爷,链接:https://www.jianshu.com/p/e766c2fba1cc】

加载、存储

计算

中断

异常

线程的切换

注意事项

  1. ARM Contex-M3 和 Contex-M4 支持16位的thumb指令和新增的32位thumb-2指令,并不支持ARM状态。与经典的ARM处理相比,有很多优劣势,具体参见《ARM Contex-M3和Contex-M4权威指南 - 第三章 - 指令集》

参考文献

  1. ARM 指令集 和 Thumb 指令集
  2. RTOS系列文章(7):CM3/4之LR寄存器、EXC_RETURN深入分析
  3. 《HardFault的诊断》
  4. 《ARM Contex-M3和Contex-M4权威指南》
相关推荐
丶Darling.36 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
百里香酚兰1 小时前
【AI学习笔记】基于Unity+DeepSeek开发的一些BUG记录&解决方案
人工智能·学习·unity·大模型·deepseek
布丁不叮早起枣祈1 小时前
10.3学习
学习
结衣结衣.2 小时前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
LN-ZMOI2 小时前
c++学习笔记1
c++·笔记·学习
五味香2 小时前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
云端奇趣3 小时前
探索 3 个有趣的 GitHub 学习资源库
经验分享·git·学习·github
我感觉。3 小时前
【信号与系统第五章】13、希尔伯特变换
学习·dsp开发
知识分享小能手3 小时前
mysql学习教程,从入门到精通,SQL 修改表(ALTER TABLE 语句)(29)
大数据·开发语言·数据库·sql·学习·mysql·数据分析
冰榫4 小时前
9.30学习记录(补)
学习