一,简单介绍:系统调用是应用程序和操作系统内核之间的功能接口。其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。
二、kernel添加一个系统调用,我这里的kernel版本是4.19,其实可以直接模仿gettid功能是实现。
1、include/linux/syscalls.h 里面添加
asmlinkage long sys_getnumber(void);
2、kernel/sys.c 里面添加,也可以在任何的c文件里面添加。这里的 SYSCALL_DEFINE0宏表示我们的系统调用是无参的,该宏在上面syscalls.h头文件中定义。 SYSCALL_DEFINE0的参数个数为一个,SYSCALL_DEFINEn的函数个数是n个
int number = 2;
SYSCALL_DEFINE0(getnumber)
{
printk("Hello world! Demo for syscall!\n");
return number+=1;
}
3、include/uapi/asm-generic/unistd.h
#define __NR_getnumber 435
__SYSCALL(__NR_getnumber, sys_getnumber)
4、kernel 部分所有的修改如下:
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 8e5b2c6d..6777013 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -688,6 +688,7 @@ asmlinkage long sys_geteuid(void);
asmlinkage long sys_getgid(void);
asmlinkage long sys_getegid(void);
asmlinkage long sys_gettid(void);
+asmlinkage long sys_getnumber(void);
asmlinkage long sys_sysinfo(struct sysinfo __user *info);
/* ipc/mqueue.c */
diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h
index be311b9..3afc94d 100644
--- a/include/uapi/asm-generic/unistd.h
+++ b/include/uapi/asm-generic/unistd.h
@@ -741,8 +741,12 @@ __SYSCALL(__NR_pidfd_send_signal, sys_pidfd_send_signal)
#define __NR_pidfd_open 434
__SYSCALL(__NR_pidfd_open, sys_pidfd_open)
+#define __NR_getnumber 435
+__SYSCALL(__NR_getnumber, sys_getnumber)
+
+
#undef __NR_syscalls
-#define __NR_syscalls 435
+#define __NR_syscalls 436
/*
* 32 bit systems traditionally used different
diff --git a/kernel/sys.c b/kernel/sys.c
index db88cc3..cbae3b3 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -900,10 +900,21 @@ SYSCALL_DEFINE0(getpid)
/* Thread ID - the internal kernel "pid" */
SYSCALL_DEFINE0(gettid)
-{
+{
return task_pid_vnr(current);
}
+int number = 2;
+
+SYSCALL_DEFINE0(getnumber)
+{
+
+ printk("Hello world! Demo for syscall!\n");
+
+ return number+=1;
+}
+
+
/*
* Accessing ->real_parent is not SMP-safe, it could
* change from under us. However, we can use a stale
三、应用测试程序,用syscall(435)直接调用底层。
2 #define LOG_TAG "LENKORSYSTEMUPDATE"
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <sys/syscall.h>
6 #include <errno.h>
7 #include <string.h>
8 #include <stdlib.h>
9
10
11 int main()
12 {
13 // pid_t tid;
14
15 // tid = syscall(__NR_reboot,0, 0, 0, 0);
16 // printf(" tid = %d __NR_reboot=%d errno = %s ",tid,__NR_reboot, strerror(errno));
17
18 int rc;
19 rc = syscall(__NR_gettid);
20 rc = syscall(435);
21 //rc = syscall(__NR_fchmod, " /data/write.txt", 0707);
22 if (rc == -1)
23 fprintf(stderr, "chmod failed, errno = %d __NR_fchmod = %d \n", errno,__NR_fchmod);
24 else
25 // printf("chmod succeess! \n");
26 printf("chmod succeess!rc=%d __NR_gettid=%d \n",rc,__NR_gettid);
27
28 // system("reboot");
29 return 0;
30 }
四、运行测试,我这里是在android设备上运行,先编译生bin文件然后push到设备里面去。运行效果图如下,上面是kernel的log,下图是adb 执行图。
五、有价值的参考文章
linux添加一个系统调用(syscall)_小小城御园的博客-CSDN博客
armlinux系统调用号和系统调用实现函数位置-gliethttp-ChinaUnix博客