2021-11-05 Linux 系统调用syscall,实例添加一个系统调用

一,简单介绍:系统调用是应用程序和操作系统内核之间的功能接口。其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。

二、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博客

linux下syscall函数_swj9099的博客-CSDN博客_syscall函数

Linux通过syscall()函数获取线程号

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值