ARM架构SVC(SWI)指令工作原理及相关信息咨询
ARM架构中SVC(SWI)指令的工作机制及相关细节
一、SVC指令的工作原理
SVC(旧称SWI)是ARM架构的超级调用指令,核心作用是触发从用户模式到特权模式(ARMv7及之前为管理模式,ARMv8+为EL1异常级别)的切换,进入内核态处理系统请求:
- 执行
SVC #imm指令时,硬件自动完成以下关键操作:- 将当前模式的程序计数器(PC)、程序状态寄存器(CPSR),分别保存到特权模式的链接寄存器(LR)和保存程序状态寄存器(SPSR)
- 切换CPU至特权模式
- 将PC指向异常向量表的SVC入口地址,启动内核的系统调用处理流程
二、超级调用ID及数据的存储位置
SVC的调用ID和参数存储规则无硬件强制要求,完全由**操作系统的ABI(应用二进制接口)**定义,主流约定如下:
- 超级调用ID:常见存放位置为
r7寄存器(ARMv7)或x8寄存器(ARMv64);部分系统会直接把ID编码在SVC指令的立即数中(如SVC #0x10) - 调用参数:按顺序存入
r0-r6(ARMv7)或x0-x7(ARMv64)寄存器,无需额外内存存储 - 返回值:内核处理完成后,将结果放回
r0(ARMv7)或x0(ARMv64)寄存器
三、超级调用ID、参数及返回类型的获取途径
这类信息不存在通用全量列表,完全依赖你使用的操作系统及对应ABI,可行的获取方式:
- 内核源码:以Linux为例,ARMv7的系统调用表在
arch/arm/include/asm/unistd.h,ARMv64的在arch/arm64/include/asm/unistd.h,文件内明确列出所有调用ID、参数数量及返回类型 - 官方ABI文档:比如ARM官方的《ARM Architecture Procedure Call Standard》(AAPCS),或特定系统的ABI规范(如Android ARM ABI、Linux ARM系统调用规范)
- 用户态头文件:编译程序依赖的
unistd.h等头文件中,会定义系统调用对应的宏(如__NR_open),可直接查看宏定义及注释
注意:不同操作系统(Linux、FreeBSD、Android等)的SVC调用规则可能完全不同,同一系统的不同版本也会有调用ID的增减,必须对应具体系统版本查询
内容的提问来源于stack exchange,提问作者TX3
相关产品推荐
相关产品推荐

