您的位置:首页 > 理论基础

[计算机基础]ARM-Linux系统调用

2014-04-26 15:06 357 查看
1,系统调用的概念:

系统调用是用户空间访问内核的唯一手段(除了异常和陷入),系统调用依靠软件中断实现,每个系统调用被赋予一个系统调用号,用来指明要执行哪个系统调用,用户空间的应用程序是执行在用户态,而系统调用时运行在内核态的,那么用户态的程序如何运行内核态的代码了,操作系统一般通过中断来从用户态切换到内核态。所有系统调用公用一个中断号,linux上默认是80号中断。那么所有的系统调用公用一个中断号,操作系统根据中断向量表跳转到80号中断的中断处理函数的时候如何知道是哪一个系统调用了,这个时候就需要用到系统调用号,系统调用号就是系统调用在系统调用表中的位置,系统调用号在执行某一个具体的系统调用前会放在某一个固定的寄存器里,对应的80中断处理程序会取这个系统调用号然后执行相应的系统调用处理函数。

2,系统调用涉及到的堆栈切换

由于用户态程序和内核态程序使用不同的栈,所以在执行80号中断处理程序之前还是要进行堆栈切换的,切换栈就是将cpu的寄存器指向不同的栈,

2,系统调用的实现:

系统调用是通过软中端(SWI)实现的,

SWI指令

SWI指令的格式为:

SWI{条件} 24位的立即数

SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用 户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同 时,参数通过其他通用寄存器传递。

指令示例:

SWI 0x02 ;该指令调用操作系统编号位02的系统例程

linux 2.6.16以后使用的方式:

指令中的24位立即数被忽略,用户请求的服务类型由寄存器R7的值决定,参数通过其他的通用寄存器传递。例如:

MOV R7, #12

SWI 0

每个系统调用都具有唯一的一个系统调用功能号 alps\kernel\arch\arm\include\asm\Unistd.h

系统调用列表,执行系统调用时,内核根据系统调用号来索引系统调用列表,找到入口函数并运行之。对应的文件是alps\kernel\arch\arm\kernel \entry-common.S

和alps\kernel\arch\arm\kernel\calls.S

接口设计相关宏 alps\kernel\include\linux\Syscalls.h

在arm linux系统中搜索某个函数在内核中系统调用的具体实现~一般搜索sys_name 或者SYSCALL_DEFINEn(name_.....

3,android上Bionic C库系统调用的实现

过程:\bionic\libc\SYSCALLS.TXT----》\bionic\libc\tools\gensyscalls.py-----》\bionic\libc\tools\arch-arm\syscall\*.s----》SWI软中端

4,如何添加系统调用

(1)\bionic\libc\SYSCALLS.TXT 中添加个接口syscall_for_test ARM_syscall_for_test

(2)运行bionic\libc\tools\gensyscalls.py:

(3)添加kernel\arch\arm\kernel\sys_syscall_for_test.c文件,加入syscall_for_test的处理:

(4)kernel\arch\arm\kernel\calls.S中添加syscall_for_test

(5)修改kernel\arch\arm\kernel\Makefile

(6)在kernel\arch\arm\kernel\ Traps.c的arm_syscall中添加ARM_syscall_for_test的处理:

(7)添加bionic\libc\include\syscall_for_test.h文件

5,系统调用上下文

内核在执行系统调用的时候处于进程上下文.current指针指向当前任务,即引发系统调用的那个进程.在进程上下文中,内核可以休眠和抢占.当系统调用返回时,控制权仍然在system_call()中,它最终会负责切换到用户空间并让用户进程继续执行下去.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: