arm linux syscall,ARM linux系统调用的实现原理

源程序:本文引用地址:http://www.eepw.com.cn/article/150660.htm

ENTRY(vector_swi)

save_user_regs

zero_fp

get_scno //将[lr,#-4]中的中断号转储到scno(r7)

arm710_bug_check scno, ip

#ifdef CONFIG_ALIGNMENT_TRAP

ldr ip, __cr_alignment

ldr ip, [ip]

mcr p15, 0, ip, c1, c0 @ update control register

#endif

enable_irq ip

str r4, [sp, #-S_OFF]! @ push fifth arg

get_current_task tsk

ldr ip, [tsk, #TSK_PTRACE] @ check for syscall tracing

bic scno, scno, #0xff000000 @ mask off SWI op-code

//#define OS_NUMBER 9[entry-header.S]

//所以对于上面示例中open系统调用号scno=0x900005

//eor scno,scno,#0x900000

//之后scno=0x05

eor scno, scno, #OS_NUMBER 20 @ check OS number

//sys_call_table项为calls.S的内容

adr tbl, sys_call_table @ load syscall table pointer

tst ip, #PT_TRACESYS @ are we tracing syscalls?

bne __sys_trace

adrsvc al, lr, ret_fast_syscall @ return address

cmp scno, #NR_syscalls @ check upper syscall limit

//执行sys_open函数

ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine

add r1, sp, #S_OFF

2: mov why, #0 @ no longer a real syscall

cmp scno, #ARMSWI_OFFSET

eor r0, scno, #OS_NUMBER 20 @ put OS number back

bcs SYMBOL_NAME(arm_syscall)

b SYMBOL_NAME(sys_ni_syscall) @ not private func

/*

* This is the really slow path. We're going to be doing

* context switches, and waiting for our parent to respond.

*/

__sys_trace:

add r1, sp, #S_OFF

mov r0, #0 @ trace entry [IP = 0]

bl SYMBOL_NAME(syscall_trace)

/*

//2007-07-01 gliethttp [entry-header.S]

//Like adr, but force SVC mode (if required)

.macro adrsvc, cond, reg, label

adrcond reg, label

.endm

//对应反汇编:

//add lr, pc, #16 ; lr = __sys_trace_return

*/

adrsvc al, lr, __sys_trace_return @ return address

add r1, sp, #S_R0 + S_OFF @ pointer to regs

cmp scno, #NR_syscalls @ check upper syscall limit

ldmccia r1, {r0 - r3} @ have to reload r0 - r3

ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine

b 2b

__sys_trace_return:

str r0, [sp, #S_R0 + S_OFF]! @ save returned r0

mov r1, sp

mov r0, #1 @ trace exit [IP = 1]

bl SYMBOL_NAME(syscall_trace)

b ret_disable_irq

.align 5

#ifdef CONFIG_ALIGNMENT_TRAP

.type __cr_alignment, #object

__cr_alignment:

.word SYMBOL_NAME(cr_alignment)

#endif

.type sys_call_table, #object

ENTRY(sys_call_table)

#include calls.S

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值