1,系统调用的概念:

是用户空间访问内核的唯一手段,系统调用依靠软件中断实现,每个系统调用被赋予一个系统调用号,用来指明要执行哪个系统调用。


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文件

posted on 2015-01-18 19:35  知了112  阅读(929)  评论(0编辑  收藏  举报