linux arm 系统调用之 swi(注释)

基于 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 里
                                        */
                                      

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值