ARM 的 SWI(Software Interrupt,软件中断)指令是用于实现系统调用(System Calls)的传统机制。它允许运行在用户模式(User mode)下的应用程序请求运行在特权模式(如 Supervisor mode)下的操作系统内核提供服务。
现在,SWI 指令在较新的 ARM 架构(ARMv7 及以后)中已被 SVC(Supervisor Call,监管调用)指令取代,但两者的概念和用法几乎完全相同。SWI 在 ARMv6 及之前的架构中更常见。
概念
- 触发异常:当 CPU 执行
SWI/SVC指令时,它会产生一个异常(Exception),导致处理器模式切换到监管模式(Supervisor Mode)。 - 跳转到异常向量表:处理器自动跳转到异常向量表(Exception Vector Table)中预定义的地址(对于
SWI,通常是0x00000008或0xFFFF0008)。 - 执行异常处理程序:该地址处存放着软件中断处理程序(Software Interrupt Handler)的代码,也就是操作系统内核中处理系统调用的部分。
- 识别和分发:处理程序会检查
SWI指令中自带的立即数(Number),这个数被称为SWI number或SVC number。操作系统根据这个号码来查询系统调用表(Syscall Table),确定用户程序请求的是哪个服务(如打开文件、写入数据、创建进程等)。 - 返回用户模式:服务执行完毕后,处理程序会执行一条特殊的返回指令(如
MOVS PC, LR),将处理器模式恢复回用户模式,并返回到用户程序中SWI指令的下一条指令继续执行。
语法和编码
1. 汇编语法 (ARM/Thumb)
SWI #<immed_24> ; ARM 指令集格式 (32位指令)
SVC #<immed_8> ; Thumb 指令集格式 (16位指令)
<immed_24>或<immed_8>是一个数字,用于标识具体的系统调用功能。- 例如,
SWI #0可能用于写入数据,SWI #1可能用于读取数据。
- 例如,
2. 机器码格式
SWI 指令的ARM 32位编码格式如下:

最低0.47元/天 解锁文章
1626

被折叠的 条评论
为什么被折叠?



