基于 3.10.90 版本
在 arch\arm\kernel\entry-armv.S 里有:
__stubs_start: /* 异常向量表开始, 主要实现 swi 即系统调用的功能
* 在函数 early_trap_init 里实现异常向量表的拷备
*/
@ This must be the first word
.word vector_swi /* 其定义在 arch\arm\kernel\entry-common.S 里 */
在 arch\arm\kernel\entry-common.S 里有:
/*=============================================================================
* SWI handler
*-----------------------------------------------------------------------------
*/
.align 5
ENTRY(vector_swi)
sub sp, sp, #S_FRAME_SIZE /* 当前 sp 为 SVC模式下的 sp
* DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));
* #define ARM_cpsr uregs[16]
* #define ARM_pc uregs[15]
* #define ARM_lr uregs[14]
* #define ARM_sp uregs[13]
* #define ARM_ip uregs[12]
* #define ARM_fp uregs[11]
* #define ARM_r10 uregs[10]
* #define ARM_r9 uregs[9]
* #define ARM_r8 uregs[8]
* #define ARM_r7 uregs[7]
* #define ARM_r6 uregs[6]
* #define ARM_r5 uregs[5]
* #define ARM_r4 uregs[4]
* #define ARM_r3 uregs[3]
* #define ARM_r2 uregs[2]
* #define ARM_r1 uregs[1]
* #define ARM_r0 uregs[0]
* #define ARM_ORIG_r0 uregs[17]
*/
stmia sp, {r0 - r12} @ Calling r0 - r12 /* 保存到 ARM_r0 -- ARM_ip*/
ARM( add r8, sp, #S_PC ) /* DEFINE(S_PC, offsetof(struct pt_regs, ARM_pc)); */
ARM( stmdb r8, {sp, lr}^ ) @ Calling sp, lr /*
* db 表示 decrease before, ^ 表示用户态
* 从而会将用户态下面的 sp 和 lr 保存到栈 ARM_lr 和 ARM_sp 里
*/