第二章 S5PV210的简单介绍
1、s5pv210的流水线
为增加处理器指令流的速度,ARM使用多级流水线。S5PV210是13级流水线,ARM11为8级。
下图是CPU简单执行过程。从存储器取指令,然后解码,最后执行。当然S5PV210的流水线没有下面这么简单,会多很多级,但是本质原理是一致的。
PC指向正被取指的指令,而非正在执行的指令。因为在armv7架构的cpu中,是可以操作PC的,如果在一个时刻读取PC的指,对于ARM指令,那么当前读取PC的指令所在的地址就是PC-8。如果是thumb指令,那么当前读取PC的指令所在的地址就是PC-4。
在armv8的64位架构中,不允许对PC进行操作。
2、ARM的异常处理机制
2.1 异常产生
当异常产生时,ARM core会做以下的操作:
1) 拷贝CPSR到SPSR_<mode>
2) 设置适当的CPSR
3) 改变处理器模式进入ARM态
4) 改变处理器模式进入相应的异常模式
5) 设置中断禁止位禁止相应中断
6) 保存返回地址到LR_<mode>
7) 设置PC为相应的异常向量
返回时,异常处理需要
1) 从SPSR_<mode>恢复CPSR
2) 从LR_<mode>恢复PC
以上操作只能在ARM态下执行,也就在异常产生后,会将CPU的状态设置为ARM状态。
异常处理中有一些事硬件自动做的,有一些是软件做的。
硬件做的事有:保存CPSR, 保存返回地址,设置CPSR。PC设置为异常表的入口地址。
软件做的事有:保存寄存器,执行异常处理程序。
2.2 异常向量表
ARM的CPU实现异常都是通过异常向量表来实现的。即每一个异常,都有对应的异常向量表的入口地址,当异常产生后,会自动跳转到异常向量表的入口地址处。
复位,软中断,中断,快速中断,取指令异常、数据异常等,统一称为异常。所以说,中断其实是异常的一种。
异常的定义就是突发事件,打断了CPU的正常常规任务,CPU不得不跳转到异常向量表中去执行异常处理程序;中断是异常的一种,一般特指SOC内的内部外设产生的打断SOC常规业务(串口中断),或者外部中断(SOC的GPIO引脚回来的中断)。
210的异常向量表的起始地址可以通过设置寄存器进行改变(CP15协处理器中设置),以适应操作系统的需求。但是在系统刚上电启动时,210内部的BL0程序在IRAM中设置了异常向量表,供暂时性使用。
通过手册可知,异常向量表的起始地址是0xd003_7400。知道了异常向量表的起始地址,则各个异常的入口地址都知道了。
使用宏定义定义各个异常向量的地址。
分别编写对应异常处理函数,其实就是往异常向量表中写入对应异常处理函数的地址。可见,当异常产生的时候,硬件会从对应异常向量中取出跳转地址值给PC,然后程序跳转,执行对应异常处理函数了。这个和STM32很类似了,和ARM11就不一样了,ARM11在异常向量表,存放的是跳转指令。
下面的代码,就是将异常处理程序函数地址,写入到异常向量表中。
函数名的本质是函数的首地址
函数名在C语言中的理解方法和变量名其实没区别。编译器会把这个函数的函数体对应的代码段和这个函数的函数名(实质是符号)对应起来,等于我们在使用这个函数名符号时,编译器会将函数的函数体实际上做替换,换成函数的首地址。因为函数体都不止4个字节,而函数名这个符号只能对应1个地址,所以实际对应的是函数代码的首地址。
拿C语言中的语法来说,函数名就是这个函数的函数指针。
将异常处理程序的首地址和异常向量表绑定起来后,异常处理初步阶段就完成了。因此在异常产生后,硬件自动跳转到对应异常向量入口区执行,就可以执行事先绑定好的异常处理函数。
中断处理要在汇编中处理
1)中断处理要保护现场(中断从SVC模式来,则保存SVC模式下的必要寄存器的值)和恢复现场(中断处理完成后,准备返回SVC模式前,要将保存的SVC模式下的必要寄存器的值恢复回去,不然回到了SVC模式后寄存器的值就变了,SVC模式下原来正在运行的任务环境就被破坏了)
1.保护现场包括:第一:设置IRQ栈, 第二:保存LR , 第三: 保存R0-R12
3) 为什么要保存LR寄存器?中断返回时关键的2个寄存器就是LR和CPSR。所以在进入IRQ模式时,应该将之前模式的下一句指令(中断返回地址,被硬件自动保存在LR寄存器中)和CPSR保存起来,因为异常处理程序,很有可能会修改这两个寄存器的值。因此要事先保存,将来恢复的时候,才可以把中断返回地址给PC,CPSR复原。
1.中断返回地址保存在LR中,CPSR保存在SPSR中。这些操作都是硬件自动完成的。
5) 使用栈来保存Rx寄存器
中断处理,汇编编写
通过stmfd来保存寄存器,通过ldmfd来恢复寄存器。并返回。
3、协处理器CP15
ARM的协处理器,是比较重要的,特别是这CP15,可以控制很多东西。如MMU,icache,dcache等。
协处理,通过mcr 和mrc指令来进行访问。
mrc用于读取CP15的寄存器
mcr用于写入CP15的寄存器
协处理器
◾SOC内部另一处理核心,协助CPU实现某些功能,被主CPU调用执行一定任务
◾ARM设计上支持多达16个协处理器,但是一般SOC只实现其中的CP15
协处理器和MMU,CACHE,TLB等处理有关,功能上和操作系统的虚拟地址映射、cache管理等有关。
mcr{<cond>} p15, <opcode_1>, <Rd>, <Crn>, <Crm>, {<opcode_2>}
opcode_1:对于cp15永远为0
Rd:ARM的普通寄存器
Crn:cp15的寄存器,合法值是c0~c15
Crm:cp15的寄存器,一般均设为c0
opcode_2:一般省略或为0
对于C1寄存器,
要想使用ARM模式下的异常,30位是要置0的。而当这一位为1的时候,在ARM模式下,是进入不了异常模式的,因此就造成中断是不起作用的。
在ARM最新的ARMv8的A64架构,将协处理器取消掉了,直接实现系统寄存器,通过MSR,MRS访问。
4、ARM处理器工作模式
ARM有7个基本工作模式
User: 用户模式,大部分任务执行在这种模式
FIQ: 快速中断模式
IRQ: 中断模式
SUPERVISOR: svc超级模式,复位和软中断的时候会进入这种模式,操作系统工作在这个模式下
Abort: 存取异常,取指令和取数据abort,会进入到这个模式
Undef: 执行未定义指令会进入这种模式
System: 使用和User模式相同寄存器集的特权模式
除USER模式是normal外(这个模式也是linux中用户的模式),其他都是privilege模式。特权模式比user模式,有更高的权限,可以访问更多的寄存器以及执行特殊的指令。
各种模式下权限和可以访问的寄存器,以及可执行的指令不同。
CPU是硬件,OS是软件,软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性。
操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要。
这些模式在操作系统的时候用处才比较明显。如果只是裸机开发,模式的用处并不大,直接工作在svc模式。
系列其他篇
原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。