ARM基础知识(6.16)
2015-06-29 20:33
176 查看
一 ARM工作模式
u(usr) s(sys) a(abt) u(udf) f(fiq) i(irq) s(svc) m(mon)
非特权模式:usr模式
特权模式 :除了usr模式
异常模式 :abt,udf,fiq,irq,svc
安全监控 :mon
特权模式特点:它可以访问ARM核内部受限制的资源,也可以自由切换到其他模式
二 ARM寄存器资源
(1)r0-r12 : 普通寄存器,可以当做c语言变量一样使用
(2)r13(sp) : 栈指针寄存器,它用来指定压栈的数据存放的地址
(3)r14(lr) : 在代码跳转的时候,用来记录pc的值,便于返回[lr->pc]
(4)r15(pc) : 程序计数器,它是告诉ARM核需要取的指令所在的地址
(6)CPSR : 程序状态寄存器,它反映当前ARM核的状态
7 6 5 4 0
--------------------------------------------------------------
N Z C V | .... | I F T | mode
--------------------------------------------------------------
mode : 当前所在的模式
T : 1->thumb状态 0->arm状态
F : 0->enable 1->disable
I : 0->enable 1->disable
N : 当前计算的结果为负数,则置1
Z : 当前计算的结果为0,则置1
C : 相加产生进位则置1,相减没有产生借位则置1
V : 符号位溢出(两个正数相加的结果为负数),则置1
(6)SPSR : 当异常产生的时候,保存CPSR的值,便于恢复现场
(7)所有模式共用的寄存器:r0-r7,pc,cpsr 8 + 1 + 1 = 10
(8)对于r8-r12,FIQ模式私有,其他模式共享 5 + 5 = 10
(9)r13,14 用户模式和系统模式共享,其他模式私有 2 + 5 x 2 = 12
(10)SPSR 异常模式拥有 5 = 5
(11)MON 模式有私有的r13,r14,spsr
注意:共享的寄存器的在使用的时候,需要先保存它原有的数据,在使用,使用完恢复他原有的数据
三 ARM核的异常处理
1.异常产生的时候,ARM核自己做的事情
[1]保存CPSR到异常模式的spsr
[2]设置CPSR相应位
<1>进入ARM状态
<2>进入相应的异常模式
<3>禁用相应的中断(可选)
[3]保存pc到异常模式的lr
[4]将pc指向对应的异常向量
2.程序需要做的事情
[1]编写异常向量表(一块内存,放了一些跳转指令)
[2]告诉ARM核异常向量表所在的位置
<1>ARM7/ARM9/ARM11 异常向量表可以存放在:0x0000 0000 或 0xffff 0000
<2>cortex-A系列,异常向量表可以存放在任意位置,它有协处理器cp15的c12寄存器决定
注意:ARM核从0x0000 0000地址寻找异常向量表
[3]编写异常处理函数
注意:
异常处理函数应该做的事情
[1]保存共用的寄存器的值
[2]做异常处理的事情
[3]返回:恢复现场
<1>恢复保存的寄存器的值
<2>将异常模式的lr寄存器值赋值给pc
<3>将异常模式的spsr赋值给cpsr
u(usr) s(sys) a(abt) u(udf) f(fiq) i(irq) s(svc) m(mon)
非特权模式:usr模式
特权模式 :除了usr模式
异常模式 :abt,udf,fiq,irq,svc
安全监控 :mon
特权模式特点:它可以访问ARM核内部受限制的资源,也可以自由切换到其他模式
二 ARM寄存器资源
(1)r0-r12 : 普通寄存器,可以当做c语言变量一样使用
(2)r13(sp) : 栈指针寄存器,它用来指定压栈的数据存放的地址
(3)r14(lr) : 在代码跳转的时候,用来记录pc的值,便于返回[lr->pc]
(4)r15(pc) : 程序计数器,它是告诉ARM核需要取的指令所在的地址
(6)CPSR : 程序状态寄存器,它反映当前ARM核的状态
7 6 5 4 0
--------------------------------------------------------------
N Z C V | .... | I F T | mode
--------------------------------------------------------------
mode : 当前所在的模式
T : 1->thumb状态 0->arm状态
F : 0->enable 1->disable
I : 0->enable 1->disable
N : 当前计算的结果为负数,则置1
Z : 当前计算的结果为0,则置1
C : 相加产生进位则置1,相减没有产生借位则置1
V : 符号位溢出(两个正数相加的结果为负数),则置1
(6)SPSR : 当异常产生的时候,保存CPSR的值,便于恢复现场
(7)所有模式共用的寄存器:r0-r7,pc,cpsr 8 + 1 + 1 = 10
(8)对于r8-r12,FIQ模式私有,其他模式共享 5 + 5 = 10
(9)r13,14 用户模式和系统模式共享,其他模式私有 2 + 5 x 2 = 12
(10)SPSR 异常模式拥有 5 = 5
(11)MON 模式有私有的r13,r14,spsr
注意:共享的寄存器的在使用的时候,需要先保存它原有的数据,在使用,使用完恢复他原有的数据
三 ARM核的异常处理
1.异常产生的时候,ARM核自己做的事情
[1]保存CPSR到异常模式的spsr
[2]设置CPSR相应位
<1>进入ARM状态
<2>进入相应的异常模式
<3>禁用相应的中断(可选)
[3]保存pc到异常模式的lr
[4]将pc指向对应的异常向量
2.程序需要做的事情
[1]编写异常向量表(一块内存,放了一些跳转指令)
[2]告诉ARM核异常向量表所在的位置
<1>ARM7/ARM9/ARM11 异常向量表可以存放在:0x0000 0000 或 0xffff 0000
<2>cortex-A系列,异常向量表可以存放在任意位置,它有协处理器cp15的c12寄存器决定
注意:ARM核从0x0000 0000地址寻找异常向量表
[3]编写异常处理函数
注意:
异常处理函数应该做的事情
[1]保存共用的寄存器的值
[2]做异常处理的事情
[3]返回:恢复现场
<1>恢复保存的寄存器的值
<2>将异常模式的lr寄存器值赋值给pc
<3>将异常模式的spsr赋值给cpsr
相关文章推荐
- 牛客网(搜狗2015 C++工程师笔试题)
- 浅谈Docker隔离性和安全性
- java学习02--变量
- 计算机系统
- [2015.6.28] OI刷题记录
- ubuntu(linux)下source、sh、bash、./执行脚本的区别
- 网易新闻评论爬虫(python+selenium+PhantomJS)
- 自学STM32---GPIO
- 按下标方式提取Dictionary的值
- Linux服务器的最大内存和CPU数
- docker网络
- iOS开发学习实例之六---瀑布流
- Android调用相机并将照片存储到sd卡上
- 可视化系列论文【INFUSE: Interactive Feature Selection for Predictive Modeling of High Dimensional Data】
- Ubuntu怎么设置root用户的密码
- CentOS7 桥接网络配置
- linux上nginx安装和使用
- Spring+MyBatis+Velocity+BootStrap实现Android混合App快速高效服务端
- java线程与锁
- Unity3D 编辑器功能之MonoBehaviour属性