Arm linux 系统调用分析
时间:11-09
来源:互联网
点击:
- eorne scno, r10, #__NR_OABI_SYSCALL_BASE
- ldrne tbl, =sys_oabi_call_table
- #elif !defined(CONFIG_AEABI)
- bic scno, scno, #0xff000000 @ mask off SWI op-code
- eor scno, scno, #__NR_SYSCALL_BASE @ check OS number
- #endif
- 检查swi命令中带的中断号是不是为0,如果不等于零说明是是old ABI方式调用的系统调用,这时将sys_oabi_call_table的地址载入到tbl中,同时得到系统调用的中断号,保存在scno中。如果swi指令中带点中断号为0,说明系统调用是利用scno寄存器传递中断号的。利用异或指令,将__NR_SYSCALL_BASE清除掉,得到实际的系统请求号(系统调用号定义为__NR_SYSCALL_BASE+x)。
- stmdb sp!, {r4, r5} @ push fifth and sixth args
- tst ip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls?
- bne __sys_trace
- 如果进程带有syscall trace标志就调用sys_trace,这处应该是作为调试用的。
- cmp scno, #NR_syscalls @ check upper syscall limit
- adr lr, ret_fast_syscall @ return address
- ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine
- 如果系统调用号,不大于NR_syscalls,就跳转到系统调用函数去执行ldrcc pc, [tbl, scno, lsl #2]
Arm系统调用的简单概述。首先是用户态执行swi指令,swi指令使得cpu陷入svc状态,并跳转到固定地址去执行系统调用处理过程。用户态通过两种方法传递给内核执行系统调用的系统调用号。内核执行系统调用处理过程,首先保存cpu现场,之后会获取到系统调用号,以系统调用地址表的基地址,加系统调用号做偏移,跳转到相应的系统调用例程做相应的处理。
Armlinux系统调 相关文章:
- ARM Linux下添加新的系统调用(11-21)
- 《ARM与Linux些许问题》第四章:ARM平台系统调用原理分析(11-09)
- Android arm linux 系统调用实现(11-09)
- arm linux 系统调用实现(11-09)
- Arm Linux系统调用流程详细解析SWI(11-09)
- ARM Linux系统调用的原理(11-09)