ARM处理器的SWI异常中断响应过程
来源:互联网 发布:js继承语法 编辑:程序博客网 时间:2024/05/29 16:33
通过SWI异常中断指令,在用户模式下应用程序可以调用系统模式下的代码,在操作系统中表现为系统调用,
那这个过程又是如何实现的呢?带着疑问让我们来学习吧!
在SWI指令中包括一个24位的立即数(中断调用号),该立即数指示了用户要请求的特定的调用功能,所以在SWI的异常中断中要读取这个中断调用号,然后根据中断号,来调用相应的处理程序。这个过程可以分两个步骤:
1.SWI异常中断处理程序
由于是在底层操作所以这个异常中断处理程序得用汇编语言编写,描述如下:
area top_swi code readonly
export swi_headler
swi_headler
stmfd sp!, {r0-r12, lr} ; 保存r0至r12,lr的寄存器值
ldr r0, [lr, #-4] ; 从存储器中取得SWI指令的所在地址
bic r0, r0, #FF000000 ; 读取24位中断调用号
mov r1, sp
;================================================
bl swi_service_func ; 调用功能服务函数,见下面
; 中断调用号通过r0寄存器传入
; 参数通过r1寄存器传入
;================================================
ldmfd sp!, {r0-r12, pc}^ ;恢复调用前的r0至r12,离开中断处理程序
end
2.功能服务程序
编写利用从中断处理函数获得的中断调用号我们可以写出如下服务函数(为了简单我们用C语言)
void swi_service_func(unsigned int number, unsigned int *reg)
{
unsigned int reg1, reg2, reg3, reg4;
//获取SWI前传入的参数
reg1 = reg[0];
reg2 = reg[1];
reg3 = reg[2];
reg4 = reg[3];
switch (number) {
case 0:
// do something
break;
case 1:
// do something
break;
.
.
.
case n:
// do something
break;
default:
// do something
}
}
// 更新结果存入r0-r3
reg[0] = updata_reg1;
reg[1] = updata_reg2;
reg[2] = updata_reg3;
reg[3] = updata_reg4;
}
这样一来只要中调用断号不同就可以实现不同的功能调用了,是不是很简单?
那这个过程又是如何实现的呢?带着疑问让我们来学习吧!
在SWI指令中包括一个24位的立即数(中断调用号),该立即数指示了用户要请求的特定的调用功能,所以在SWI的异常中断中要读取这个中断调用号,然后根据中断号,来调用相应的处理程序。这个过程可以分两个步骤:
1.SWI异常中断处理程序
由于是在底层操作所以这个异常中断处理程序得用汇编语言编写,描述如下:
area top_swi code readonly
export swi_headler
swi_headler
stmfd sp!, {r0-r12, lr} ; 保存r0至r12,lr的寄存器值
ldr r0, [lr, #-4] ; 从存储器中取得SWI指令的所在地址
bic r0, r0, #FF000000 ; 读取24位中断调用号
mov r1, sp
;================================================
bl swi_service_func ; 调用功能服务函数,见下面
; 中断调用号通过r0寄存器传入
; 参数通过r1寄存器传入
;================================================
ldmfd sp!, {r0-r12, pc}^ ;恢复调用前的r0至r12,离开中断处理程序
end
2.功能服务程序
编写利用从中断处理函数获得的中断调用号我们可以写出如下服务函数(为了简单我们用C语言)
void swi_service_func(unsigned int number, unsigned int *reg)
{
unsigned int reg1, reg2, reg3, reg4;
//获取SWI前传入的参数
reg1 = reg[0];
reg2 = reg[1];
reg3 = reg[2];
reg4 = reg[3];
switch (number) {
case 0:
// do something
break;
case 1:
// do something
break;
.
.
.
case n:
// do something
break;
default:
// do something
}
}
// 更新结果存入r0-r3
reg[0] = updata_reg1;
reg[1] = updata_reg2;
reg[2] = updata_reg3;
reg[3] = updata_reg4;
}
这样一来只要中调用断号不同就可以实现不同的功能调用了,是不是很简单?
- ARM处理器的SWI异常中断响应过程
- ARM处理器的SWI异常中断响应过程
- ARM处理器的SWI异常中断响应过程
- ARM处理器的SWI异常中断响应过程
- ARM的SWI异常中断处理程序设计
- arm处理器异常处理-swi
- arm处理器异常处理-swi
- arm处理器异常处理-swi (转载)
- ARM基础学习-SWI异常中断处理
- ARM汇编的SWI指令软中断
- ARM汇编的SWI指令软中断
- 基于ARM的软件中断swi
- ARM 处理器 ~ 中断与异常
- ARM SWI软中断
- ARM 软中断指令SWI
- ARM 软中断指令SWI
- ARM中swi(软中断)
- arm swi 软中断测试
- Java RMI之HelloWorld篇
- 1:java.util.Timer类是一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。 2:TimerTask类是由 Timer 安排为一次执行或重复执行的任
- linux .so文件
- android实现服务器图片本地缓存
- ostocy-jshop编译后,classes文件中为空的bug修正
- ARM处理器的SWI异常中断响应过程
- 怎么把win7/win8里面的计算机放到任务栏中
- freemarker处理小数和整数共存的情况
- 安装完sql server2008后系统80端口被占用问题
- 曾经那些有实际帮助的网站
- 表达式求值
- Java吃豆子游戏-2 接口
- 推荐一本书
- Java程序员.回头学C/C++ 之 Java&C基本数据类型大对比