理论学习-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权威指南》
相关推荐
秃头佛爷2 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
dayouziei4 小时前
java的类加载机制的学习
java·学习
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习
晨曦_子画8 小时前
3种最难学习和最容易学习的 3 种编程语言
学习
城南vision8 小时前
Docker学习—Docker核心概念总结
java·学习·docker
ctrey_9 小时前
2024-11-1 学习人工智能的Day20 openCV(2)
人工智能·opencv·学习
十年之少9 小时前
由中文乱码引来的一系列学习——Qt
学习
u01015265810 小时前
STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器
笔记·stm32·学习
王俊山IT11 小时前
C++学习笔记----10、模块、头文件及各种主题(二)---- 预处理指令
开发语言·c++·笔记·学习
慕卿扬11 小时前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn