微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Arm linux 系统调用分析

Arm linux 系统调用分析

时间:11-09 来源:互联网 点击:

  1. eorne scno, r10, #__NR_OABI_SYSCALL_BASE
  2. ldrne tbl, =sys_oabi_call_table
  3. #elif !defined(CONFIG_AEABI)
  4. bic scno, scno, #0xff000000 @ mask off SWI op-code
  5. eor scno, scno, #__NR_SYSCALL_BASE @ check OS number
  6. #endif
  7. 检查swi命令中带的中断号是不是为0,如果不等于零说明是是old ABI方式调用的系统调用,这时将sys_oabi_call_table的地址载入到tbl中,同时得到系统调用的中断号,保存在scno中。如果swi指令中带点中断号为0,说明系统调用是利用scno寄存器传递中断号的。利用异或指令,将__NR_SYSCALL_BASE清除掉,得到实际的系统请求号(系统调用号定义为__NR_SYSCALL_BASE+x)。


  1. stmdb sp!, {r4, r5} @ push fifth and sixth args
  2. tst ip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls?
  3. bne __sys_trace
  4. 如果进程带有syscall trace标志就调用sys_trace,这处应该是作为调试用的。
  5. cmp scno, #NR_syscalls @ check upper syscall limit
  6. adr lr, ret_fast_syscall @ return address
  7. ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine
  8. 如果系统调用号,不大于NR_syscalls,就跳转到系统调用函数去执行ldrcc pc, [tbl, scno, lsl #2]

总结

Arm系统调用的简单概述。首先是用户态执行swi指令,swi指令使得cpu陷入svc状态,并跳转到固定地址去执行系统调用处理过程。用户态通过两种方法传递给内核执行系统调用的系统调用号。内核执行系统调用处理过程,首先保存cpu现场,之后会获取到系统调用号,以系统调用地址表的基地址,加系统调用号做偏移,跳转到相应的系统调用例程做相应的处理。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top