[linux内核]ARM-Linux系统调用

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


每个系统调用都具有唯一的一个系统调用功能号  alpskernelarcharmincludeasmUnistd.h
系统调用列表,执行系统调用时,内核根据系统调用号来索引系统调用列表,找到入口函数并运行之。对应的文件是alpskernelarcharmkernel entry-common.S
和alpskernelarcharmkernelcalls.S
接口设计相关宏  alpskernelincludelinuxSyscalls.h
在arm linux系统中搜索某个函数在内核中系统调用的具体实现~一般搜索sys_name 或者SYSCALL_DEFINEn(name_.....


3,android上Bionic C库系统调用的实现
过程:ioniclibcSYSCALLS.TXT----》ioniclibc oolsgensyscalls.py-----》ioniclibc oolsarch-armsyscall*.s----》SWI软中端


4,如何添加系统调用
(1)ioniclibcSYSCALLS.TXT 中添加个接口syscall_for_test ARM_syscall_for_test
(2)运行bioniclibc oolsgensyscalls.py:
(3)添加kernelarcharmkernelsys_syscall_for_test.c文件,加入syscall_for_test的处理:
(4)kernelarcharmkernelcalls.S中添加syscall_for_test
(5)修改kernelarcharmkernelMakefile
(6)在kernelarcharmkernel Traps.c的arm_syscall中添加ARM_syscall_for_test的处理:
(7)添加bioniclibcincludesyscall_for_test.h文件

原文地址:https://www.cnblogs.com/zhiliao112/p/4232136.html