一、ARM处理器简介及RISC特点

1、ARM处理器简介

  ARM(Advanced RISC Machines)是一个32位RISC(精简指令集)处理器架构,ARM处理器则是ARM架构下

的微处理器。ARM处理器广泛的使用在许多嵌入式系统。ARM处理器的特点有指令长度固定,执行效率高,低成本等。

2、RISC设计主要特点:

  (1)指令集——RISC减少了指令集的种类,通常一个周期一条指令,采用固定长度的指令格式,编译器或程序员通过几条指令完成一个复杂的操作。而CISC指令集的指令长度通常不固定;

  (2)流水线——RISC采用单周期指令,且指令长度固定,便于流水线操作执行;

  (3)寄存器——RISC的处理器拥有更多的通用寄存器,寄存器操作较多。例如ARM处理器具有37个寄存器;

  (4)Load/Store结构——使用加载/存储指令批量从内存中读写数据,提高数据的传输效率;

  (5)寻址方式简化,指令长度固定,指令格式和寻址方式种类减少。

二、Arm的基本数据类型:

  双字节(DoubleWord):64位

  字(Word):在ARM体系结构中,字的长度为32位。

  半字(Half-Word):在ARM体系结构中,半字的长度为16位。

  字节(Byte):在ARM体系结构中,字节的长度为8位。

三、ARM处理器存储格式:

  ARM体系结构将存储器看作是从0地址开始的字节的线性组合。作为32位的微处理器,ARM体系结构所支持的

最大寻址空间为4GB。ARM体系结构可以用两种方法存储字数据,分别为大端模式和小端模式。

  大端模式(高地高低):字的高字节存储在低地址字节单元中,字的低字节存储在高地址字节单元中。

  小端模式(高高低低):字的高字节存储在高地址字节单元中,字的低字节存储在低地址字节单元中。

四、内核的工作模式:

  1、用户模式(user):正常程序执行模式;

  2、快速中断模式(FIQ):高优先级的中断产生会进入该种模式,用于高速通道传输;

  3、外部中断模式(IRQ):低优先级中断产生会进入该模式,用于普通的中断处理;

  4、特权模式(Supervisor):复位和软中断指令会进入该模式;

  5、数据访问中止模式(Abort):当存储异常时会进入该模式;

  6、未定义指令中止模式(Undefined):执行未定义指令会进入该模式;

  7、系统模式(System):用于运行特权级操作系统任务;

  8、监控模式(Monitor):可以在安全模式和非安全模式之间切换;

五、ARM9的5级流水线:

1、流水线的执行顺序:取指令->译码->执行->缓冲/数据->回写

  (1)取指令(Fetch):从存储器读取指令;

  (2)译码(Decode):译码以鉴别它是属于哪一条指令;

  (3)执行(Execute):将操作数进行组合以得到结果或存储器地址;

  (4)缓冲/数据(Buffer/data):如果需要,则访问存储器以存储数据;

  (5)回写:(Write-back):将结果写回到寄存器组中;

2、影响流水线性能的因素:

(1)互锁:

  不同的指令顺序也会造成时钟周期的不同,比如一条指令的执行需要前一条指令执行的结果,如果这时结果

  还没出来,那就需要等待,这就是流水线互锁:

      LDR r1, [r2, #4]

      ADD r0, r0, r1 //r1的值需要等到LDR的结果

(2)跳转指令:

  跳转指令也会破坏流水线的行为,后续指令的取值步骤受到跳转目标的影响。

3、寄存器组织:

(1)ARM Cortex-A8处理器有40个32位长的寄存器:

    a、32个通用寄存器

    b、7个状态寄存器:1个CPSR(当前程序状态寄存器)

     6个SPSR(备份程序状态寄存器)

    c、1个PC(程序计数器)

(2)每一种处理器模式有一组响应的寄存器组,如下对应方式:

(3)通用寄存器包括R0-R15,可以分为3类:

A、未分组寄存器R0 – R7:

  在所有运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途。因此在中断或异常

处理进行异常模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,所以可能造成寄存器中数据的破坏。

B、分组寄存器R8 – R14:

  对于分组寄存器,他们每次所访问的物理寄存器都与当前的处理器运行模式相关。

  R13常用作存放堆栈指针,用户也可以使用其他寄存器存放堆栈指针,称为SP;

  R14称为链接寄存器(LR),当执行子程序时,R14可得到R15(PC)的备份,执行完子程序后,又将R14的值

  复制回PC,即使用R14保存返回地址。

C、程序计数器PC(R15):

  寄存器R15用作程序计数器(PC),在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,

  位[31:1]用于保存PC。对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的

  地址值加8个字节。

(4)程序状态寄存器:

  CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括

条件标志位、中断禁止位、当前处理器模式标志位以及其他一些相关的控制和状态位。包含以下内容:

ALU状态标志的备份;

当前的处理模式

中断使能标志;

设置处理的状态;

  每一种运行模式下都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序

状态寄存器),当异常发生时,SPSR用于保存当前CPSR的值,从异常退出时则可由SPSR来恢复CPSR。

由于用户模式和系统模式不属于异常模式,这两种状态下没有SPSR,因此在这两种状态下访问SPSR,结果是未知的。

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料https://link.zhihu.com/?target=https%3A//docs.qq.com/doc/DUGZVQk1qWVBHTEl3

学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂是不是学完操作系统原理后觉得纸上谈兵不过瘾?是不是面对浩若烟海的Linux内核源代码迷失在代码的海洋里不知所措?这门课可以带您用理论结合实践的方法一步一步抓住Linux内核最核心的部分代码,理解Linux操作系统运行的基本过程及涉及的核心机制。https://ke.qq.com/course/4032547?flowToken=1044374

六、ARM指令集:

1、数据操作指令:

(1)MOV 将数据从一个寄存器传送到另一个寄存器:

  MOV AX,2000H;将16位数据2000H传送到AX寄存器

  MOV AL,20H;将8位数据20H传送到AL寄存器

  MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器

  MOV AL,[2000H];将2000H单元的内容传送到AL寄存器

  MOVW 把 16 位立即数放到寄存器的底16位,高16位清0

  MOVT 把 16 位立即数放到寄存器的高16位,低 16位不影响

   movw r8, #19028 ; 0x4a54

   movt r8, #49456 ; 0xc130

   r8 = 0xc1304a54

(2)AND将寄存器做“逻辑与”操作后保存结果到其他寄存器

AND R2,R1,R3 // R2 = R1 & R3

ANDS R0,R0,#0x01 // R0 = R0 & 0x01

(3)SUB

SUB R0,R1,R2 //R0 = R1 – R2

SUB R0,R1,#256 //R0 = R1 -256

(4)ADD

ADD R0,R1,R2 //R0 = R1 + R2

ADD R0,R1,#256 //R0 = R1 + 256

ADD R0,R2,LSL#1 //R0 = R2 + (R3 << 1)

(5)CMP比较指令

(6)BIC位清零指令

BIC R0,R0,#0x1011 //清除位 0/1/3

2、乘法指令:

  MUL MLA

  MUL R1,R2,R3 //R1 = R2 * R3

  MOV R0,#0x0A

  MLA R1,R2,R3,R0 // R1 = R2 * R3 + 10

3、Load/Store指令:

(1)LDR从存储器中将一个32位的字数据传送到目的寄存器中。

LDR R1,[R0,#0x12] //将R0 +12地址处的数据读出,保存到R0中;

LDR R1,[R0,R2] //将R0 + R1地址的数据读出,保存到R1中;

LDR RD,[Rn],#0x04 //Rn的值用作传输数据的基地址,在数据传送后,将偏移量0x04与Rn相加写回到Rd中

  LDR R0,[R1,LSL #3] ;将存储器地址为R1*8的字数据读入寄存器R0。

  LDR R0,[R1,R2,LSL #2] ;将存储器地址为R1+R2*4的字数据读入寄存器R0。

  LDR R0,[R1,,R2,LSL #2]! ;将存储器地址为R1+R2*4的字数据读入寄存器R0,并将R1+R2*4的值存入R1。

(2)STR 用于将一个32bit的数据写入到指定的内存单元

STR R0,[R1],#8   //将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

  STR R0,[R1,#8]  //将R0中的字数据写入以R1+8为地址的存储器中

  STR R1, [R0]     //将r1寄存器的值,传送到地址值为r0的(存储器)内存中

4、跳转指令:

  B 跳转指令

  BL 带返回的连接跳转

  BX 跳转并切换状态

  BLX 带返回的跳转并切换状态

5、状态操作指令:

  ARM指令提供了两条如下指令,可直接控制程序状态寄存器(只有在特权模式下才能修改状态寄存器):

(1)MRS: 把程序状态寄存器的值送到一个通用寄存器中

MRS R1, CPSR //将CPSR状态寄存器读出,保存到R1中

MRS R2, SPSR

(2)MSR:把寄存器的内容传送到程序状态寄存器

MSR CPSR_c,#0xD3 //CPSR[7:0] = 0xD3切换到管理模式

MSR CPSR_c,R3  //CPSR = R3

6、异常产生指令:

  SWI:软中断指令,产生软中断,处理器进入管理模式;

  SWI 0 //产生软中断,中断立即数为0

  SWI 0x123456 //产生软中断,中断立即数为0x123456

  BKPT:断点中断指令,处理器产生软件中断;

    产生一个预取异常,用来设置软件断点;

七、ARM指令的寻址方式:

1、立即数寻址:

  MOV R0,#0 //送0到R0中

  ADD R3,R3,#1 //R3的值加1

  CMP R7,#1000 //R7的值和1000比较

  BIC R9,R8,#0xff00 //将R8中8~15位清0,结果保存在R9中

2、寄存器寻址:

  寄存器的值可以被直接用于数据操作指令

  MOV R2,R0 //R0的值送R2

  ADD R4,R3,R2 //R4 = R2 + R3

   CMP R7,R8 //比较R7和R8的值

3、寄存器移位寻址:

  预处理和移位发生在同一周期内,有效使用移位寄存器,可以提供代码执行效率;

   ADD R2,R0,R1,LSR #5

   MOV R1,R0,LSL #2

   RSB R9,R5,R5,LSL #1

   SUB R1,R2,R0,LSR #4

4、寄存器间接寻址:

  LDR R1,[R2] //将R2的数值作为地址,取出地址中的数据保存到R1中

  STR R1,[R2] //将R2数值作为地址,取出R1中的值存入R2所指向的地址

5、基址变址寻址:

  基址变址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址;

  基址变址寻址常用于查表、数组操作、访问基址附近的存储单元等。

   LDR R1,[ R0,#0xf ] //将R0的数值加0x0f作为地址,取出此地址的数值保存到R1

   STR R1,[R0,#-2] //将R0的数值减2作为地址,将R1中的内容保存到此地址中

   STR R1,[R0,+R2] //将R0的值加上R2的值作为地址,把R1的内容保存到该地址

6、多寄存器寻址/块拷贝寻址:

  批量Load、Store指令将一片连续的内存单元数据加载到通用寄存器组中,或将一组通用寄存器的数据存储

到内存单元中:

    IA :后递增方式

    IB :先递增方式

    DA:后递减方式

    DB:先递减方式

  块拷贝寻址指令:

   STMIA

   STMIB

7、相对寻址:

  BL FUN1 //调用到FUN1的子程序

  B LOOP //条件跳转到LOOP标号处

  STMDA

  STMDB

八、异常中断

1、硬件中断&软件中断:

  硬件中断是随机的,不可预测的

  软件中断是事先安排的(如workQueue、task)

2、ARM处理器有七种类型的异常:

  (1)复位异常(Reset):处理器在工作时, 突然按下重启键, 就会触发该异常;

  (2)数据异常(Data Abort):读取数据失败;

  (3)快速中断异常(FIQ):快速中断要比普通中断响应速度要快一些;

  (4)外部中断异常(IRQ):普通中断;

  (5)预取异常(Prefetch Abort):预取指令失败, ARM 在执行指令的过程中, 要先去预取指令准备执行,

           如果预取指令失败, 就会产生该异常;

  (6)软中断异常(SWI):软件中需要去打断处理器工作, 可以使用软中断来执行 ;

  (7)未定义指令异常(Undefined Instruction):处理器无法识别指令的异常, 处理器执行的指令是有规范的

           如果尝试执行不符合要求的指令, 就会进入到该异常指令对应的地址中;

  当异常发生时,分组寄存器R14和SPSR用于保存处理器状态,

  异常返回时,SPSR内容恢复到SPSR,链接寄存器R14的内容恢复到程序计数器PC。

  下图中每种异常对应一种内核的工作模式,当然每种异常产生,内核都会进入特定的工作模式;

3、异常处理流程:

(1)中断响应所做的工作:

  A、保存短点:保存下一将要执行的指令的地址,也就是把这个地址送入堆栈;

  B、寻找中断入口:根据不同的中断源产生的中断,查找不同的入口地址;

  C、执行中断处理程序;

  D、中断返回:执行完中断指令后,就从中断返回到主程序继续执行;

(2)异常向量表

  每一个异常发生时,总是从异常向量表开始跳转,所谓的异常向量表,是指由7个异常向量及其处理函数跳转

关系组成的表:

   0x00000000: b reset

   0x00000004: ldr pc, _undefined_instruction

   0x00000008: ldr pc, _software_interrupt

   0x00000008: ldr pc, _software_interrupt

   0x0000000c: ldr pc, _prefetch_abort

   0x00000010: ldr pc, _data_abort

   0x00000014: ldr pc, _not_used //保留

   0x00000018: ldr pc, _irq

   0x0000001c: ldr pc, _fiq

(3)当一个ARM异常返回时,需要完成如下任务:

    通用寄存器的恢复;

    状态寄存器的恢复;

    PC指针的恢复;

深度剖析Linux内核(ARM体系结构)相关推荐

  1. 深度剖析Linux内核地址映射机制

    深度剖析Linux内核地址映射机制 1.虚拟空间数据结构   2.进程虚拟空间  3.内存映射 视频讲解如下,点击观看: Linux内核开发系列第7讲--深度剖析Linux内核地址映射机制 C/C++ ...

  2. 深度剖析 Linux 的 3 种“拷贝”命令

    作者 | 奇伢       责编 | 欧阳姝黎 概述 Linux 下有 3 种"拷贝",分别是 ln,cp,mv,这 3 个命令貌似都能 copy 出一个新的文件出来. 细心的小伙 ...

  3. linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......

    课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...

  4. 实例解析linux内核I2C体系结构

    实例解析linux内核I2C体系结构 一.概述 谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完 ...

  5. JAVA深度剖析之JVM的体系结构

    JAVA深度剖析之JVM的体系结构 JAVA深度剖析之JVM的体系结构: JVM的生命周期 JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有publicstaticvo ...

  6. Linux内核ARM架构异常中断向量表

    Linux内核ARM架构异常中断向量表 说明 ARM中异常中断的种类 ARM异常中断向量表 内核异常向量表 异常向量表跳转 vector_srub宏 内核启动建立异常向量表   当异常中断发生时,系统 ...

  7. linux内核 arm交叉编译

    我的Ubuntu版本是14.04 1.在官网下载Linux内核源码     官网地址:https://www.kernel.org/ 2.解压Linux内核源码 3.安装arm-gcc交叉编译工具链: ...

  8. 实例解析linux内核I2C体系结构(1)

    作者:刘洪涛,华清远见嵌入式学院讲师. 一.概述 谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来 ...

  9. linux内核I2C体系结构(注意结构体原型)

    一.概述 谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完成.下面比较下这两种驱动. 第一种方法 ...

最新文章

  1. 马化腾:微信将被谁颠覆,领衔下一代互联网的终端居然是?
  2. 34. Leetcode 234. 回文链表 (链表-双指针)
  3. 财务管理的革新带动财务软件的变革
  4. 【HDU - 1455】Sticks (dfs + 剪枝)
  5. Hive - Create TableDrop Table ALTER Table(中)
  6. 零火线都带电该怎么处理?
  7. Windows 底层驱动级 Anti-Rootkit 工具 ScDetective 源代码
  8. Matlab帮助文档打开和命令窗口中文显示设置
  9. 阿里云国际版Windows操作系统的ECS云服务器上搭建WordPress网站
  10. 普歌-码上鸿鹄团队-复习系统模块
  11. python 中 while 语句的练习题
  12. Dzz任务板初版完成笔记-仿trello私有部署的一款轻量团队任务协作工具。
  13. 应用计算机怎么弹ink,Win10不小心按W键结果弹出INK工作区的处理方法
  14. JavaWeb之上传与下载
  15. 男人,就要对自己下手狠一点
  16. 全球与中国汽车检测设备市场现状及未来发展趋势
  17. favicon.ico介绍,网页图标的制作动态网页图标
  18. 小白鼠喝毒水问题(一分为二的思想)
  19. 操作系统期末考试试卷
  20. 领袖六种能力与七大根性(余世维)

热门文章

  1. 小学计算机学情分析报告,美图小学信息技术_秀秀美图更漂亮教学设计学情分析教材分析课后反思...
  2. 安卓UI自动化工具4399AT环境搭建
  3. 一、C语言的具体结构
  4. 编码理论第十一章:LDPC码原理学习及其习题分析
  5. 骗你不是人 硬盘传输速度提升4倍的方法
  6. python json方法详解_详解python中的json的基本使用方法
  7. scratch做出按键控制屏幕滚动效果
  8. 小米十周年雷军演讲全文:和这个伟大时代同行,是最大的荣幸
  9. 在阿里云上做云防火墙引流
  10. vue3下载文件流 下载excel