swi异常模式 程序示例
swi:software interrupt (软件中断)
为什么引入软件中断呢?
ARM的CPU一共有7中模式,除了用户模式外,其他的都是特权模式,这些特权模式可以通过修改CPSR寄存器进入其他模式。用户模式不能修改CPSR寄存器,进入其他模式。在Linux系统里,应用程序一般运行于用户模式。
APP运行于usr Mode。它是一种受限的模式。比如说,不可访问硬件。若APP想要访问硬件怎么办?APP想访问硬件,必须切换模式。
怎样切换模式?
1. 发生异常。
1.1 中断,
1.2 und未定义指令异常,
1.3 swi #val 。通过val值分辨为什么执行swi。这里使用软中断。随时可以使用软中断切换模式。
在und程序基础上更改程序,新程序015_swi_exception_014_005.
在start.S中把要做的事情列出来:
1. 复位之后,cpu处于svc模式(管理模式),现在切换到usr模式
手册,usr模式下M4~M0是1000
mrs r0,cpsr /* 读出cpsr */
bic r0,r0,#0xf /* 修改M4~M0为ob10000,进入usr模式 。所有模式的第4bit都为1,值需要最后4bit清零*/
msr cpsr,r0 /* 将数据写入cpsr */
2. 设置sp_usr。设置usr模式下的栈
ldr sp,0x34000000
3. 引入一条 swi命令,如 swi 0x123 。执行此命令,触发swi异常,进入0x8的位置执行。(swi异常的向量地址是0x8)。
4.在0x8位置放入一条跳转指令,ldr pc , swi_addr 。
5.添加swi异常,执行的代码。仿照und异常来做。
swi_addr :
.word do_swi
6. do_swi
do_swi
7. 加入 .align 4 /* 表明其后的标号要放在4字节对齐的位置,防止程序不能运行。 */
002程序:在中断程序中读出val值。
1. 修改start.S
应用程序根据 swi 带入的不同的值,来分辨是调用内核中哪一个系统调用。