- 找到一个确认能编译到的kernel C文件添加系统调用函数如:./你的源码目录/kernel/fork.c 依照fork() 系统调用 添加自己的系统调用 SYSCALL_DEFINE0() 是指声明的这个系统调用含有零个参数
- 添加相应的函数声明 include/linux/syscalls.h
3、添加系统调用号 arch/arm64/include/asm/unistd32.h
- 修改系统调用号的总数,总数一定要比你相应的系统号数大一。arch/arm64/include/asm/unistd.h
- 编译内核从新烧写,然后编写应用程序使用 arm-linux-gcc 编译 相应的应用程序添加到板子上 android 系统的编译需要 –static 应用程序如下:
/*************************************************************************
> File Name: sys_call.c
> Author: Arctan
> Mail: 2757904225@qq.com
> Created Time: Tue 23 Jul 2019 11:45:11 PM PDT
************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
int main(){
pid_t pid;
int in = -1;
pid = syscall(20);
printf("--- >use syscall(20) :pid ==%d\n",pid);
pid = getpid();
printf("use getpid :pid ==%d\n",pid);
in = syscall(390);
in = syscall(391);
return 0;
}
- 系统调用初步分析 arch/arm64/kernel/sys32.c
可以看到 __NR_compat_syscalls 刚好为我们定义的系统调用总数,这里数组 先把每个系统调用号初始化为 sys_ni_syscall 然后再 展开 #include <asm/unistd32.h> 头文件初始化相应的系统号。而系统调用是根据 compat_sys_call_table 数组进行查询的 调用相应的系统调用的。
以上内容适合arm64 版本的板子,具体的系统调用流程下次分析。。。。。。