给linux系统添加系统调用

实验环境 debian-9.8.0-amd64

步骤一 准备内核源代码

1 wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.14.tar.xz

或者使用国内镜像以加快下载速度

1 wget https://mirror.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.20.14.tar.gz

使用tar -xvf 命令解压

步骤二 修改系统调用表

cd linux-4.20.14nano ./arch/x86/entry/syscalls/syscall_64.tbl

找到一个空闲的系统调用号,新建一项系统调用

1 330    common    pkey_alloc      __x64_sys_pkey_alloc
2 331    common    pkey_free       __x64_sys_pkey_free
3 332    common    statx           __x64_sys_statx
4 333    common    io_pgetevents   __x64_sys_io_pgetevents
5 334    common    rseq            __x64_sys_rseq
6 335    common    foo             __x64_sys_foo

步骤三 声明系统调用服务例程

1 nano ./include/linux/syscalls.h
1 asmlinkage long sys_foo(pid_t pid,int flag,int nicevalue,void __user* prio,void __user* nice);

步骤四 实现服务例程

1 nano ./kernel/sys.c 
 1 SYSCALL_DEFINE5(foo,pid_t,pid,int,flag,int,nicevalue,void __user*,prio,void __user*,nice){
 2     struct pid * kpid;
 3     struct task_struct * task;
 4     kpid = find_get_pid(pid);
 5     task = pid_task(kpid,PIDTYPE_PID);
 6     int dwnice = task_nice(task);
 7     int dwprio = task_prio(task);
 8     if(flag == 1){
 9         set_user_nice(task,nicevalue);
10         dwnice = task_nice(task);
11         copy_to_user(nice,&dwnice,sizeof(dwnice));
12         copy_to_user(prio,&dwprio,sizeof(dwprio));
13         return 0;
14     }
15     else if (flag == 0){
16         copy_to_user(nice,&dwnice,sizeof(dwnice));
17         copy_to_user(prio,&dwprio,sizeof(dwprio));
18         return 0;
19     }20     return EFAULT;
21 }

步骤五 编译内核

编译内核中会遇到一些依赖未安装的问题,一般按照错误提示解决即可。

make menuconfig #如果一切正常,会出现一个蓝色界面 保持默认设置 save exit exit 即可
make        #make时间会很长
make modules
make modules_install
make install
reboot

步骤六 测试系统调用

nano test.c
 1 #include <unistd.h>
 2 #include<sys/syscall.h>
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 int main(){
 6     pid_t pid;
 7     int nicevalue = 0;
 8     int flag;
 9     int p = 0;
10     int n = 0;
11     printf("flag:\n");
12     scanf("%d",&flag);
13     printf("pid:\n");
14     scanf("%d",&pid);
15     if(flag == 1){
16         printf("nice:\n");
17         scanf("%d",&nicevalue);
18     }
19     syscall(335,pid,flag,nicevalue,&p,&n);
20     printf("nice%d,prio%d\n",n,p);
21     return 0;
22 }
 1 root@debian:~/test$ ./a.out
 2 flag:
 3 1
 4 pid:
 5 1675
 6 nice:
 7 1
 8 nice1,prio20
 9 root@debian:~/test$ ./a.out
10 flag:
11 0
12 pid:
13 1675
14 nice1,prio21

EOF

原文地址:https://www.cnblogs.com/BD1A489/p/10500279.html

时间: 2024-10-09 23:37:58

给linux系统添加系统调用的相关文章

向linux内核添加系统调用新老内核比较

2.6内核 1>修改linux-source-2.6.31/kernel/sys.c文件,在文件末尾添加系统响应函数.函数实现如下: asmlinkage int sys_mycall(int number) { printk("这是我添加的第一个系统调用"); return number; } 2>在linux-source-2.6.31/arch/x86/kernel/syscall_table_32.S 中添加:.long sys_mycall 如: .long sy

linux系统添加swap虚拟内存与删除配置方法

兄弟连Linux培训教程 linux系统添加swap虚拟内存与删除配置(www.lampbrother.net) 1.swap概述 Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中.这样,系统总是在物理内存不够时,才进行Swap交换. 其实

Linux系统添加虚拟IP(Suse linux为例)

之前有提到Windows服务器添加多个虚拟IP的方法,只需要用图形化界面就可以了,但是Linux服务器就没那么简单.所以总结了这么一篇教程,记录一下如何在Linux服务器上添加虚拟IP. 1)以Root权限登录,或者登陆以后su - 获取root权限. 2)跳转到Network设置的位置: cd /etc/sysconfig/network-scripts 3)查看一下现有的网络适配器有哪些: ls ifcfg-eth* 可以看到一个或一些类似于: ifcfg-eth-id-12:34:56:7

嵌入式linux驱动开发之给你的linux系统添加温度传感器模块

忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而且剩余很多,可以用软件资源来代替硬件资源,比如说可以用视频编解码软件取代硬件来工作.但有很多模块需要实时的采集数据这都是软件永远无法代替的,而且随着互联网的进一步发展,智能化也是一个必然的趋势,因此大量的传感器和控制芯片将被应用到生产生活中,所以个人觉得驱动开发还是个不错的方向.同时,作为学习者,再

Linux 系统添加操作记录--命令审计功能

**Linux 系统添加操作记录审计 1.mkdir -p /usr/local/domob/records/ chmod 777 /usr/local/domob/records/ chmod +t /usr/local/domob/records/ 2.vi /etc/profile 在最后添加下面的代码 if [ ! -d /usr/local/domob/records/${LOGNAME} ] then mkdir -p /usr/local/domob/records/${LOGNA

通过内核编译法向Linux内核添加系统调用

[实验内容]: 向Linux添加一个系统调用 测试该系统调用 使用ptrace或类似的系统跟踪工具来对该测试程序进行跟踪调试 [软件]:VMWare支持的Ubuntu虚拟机 VSCode [步骤] 1.在实验之前先下载好相关软件包 不过如果升级了make以后,如果内核版本低,会报错 1. sudo apt-get install make 2. sudo apt-get install gcc 3. sudo apt-get install libncurses5-dev 4. sudo apt

云服务器 ECS Linux 系统添加“回收站”

删除是危险系数很高的操作,一旦误删可能会造成难以估计的损失.在云服务器 ECS Linux 系统中这种危险尤为明显.比如,一条简单的语句:rm –rf /* 就会把整个系统全部删除,而 Linux 并不会因为这条语句的不合理而拒绝执行. 在 Windows 中,为了防止误删,系统默认提供了回收站功能.用户在执行删除操作后,文件并不会直接从硬盘中删除,而是被放到回收站中.在清空回收站前,如果发现有文件被误删,用户可以将回收站中的文件恢复到原来的位置.而 Linux 并没有提供类似功能,删除命令 r

Linux系统添加新用户

Linux系统中一般不直接使用root用户进行操作,需要添加新的用户. 首先,查看当前系统已有的用户 cat /etc/passwd 其次,添加想要的用户 useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-r] name -d:指定用户登入时的主目录,替换系统默认值/home/<用户名> -g:指定用户所属的群组.值可以使组名也可以是GID.用户组必须已经存在的,期

Linux系统添加crontab任务无效的问题解决方案

之前在linux的crontab中添加自定义的任务--定时执行指定脚本,一直失败,后来终于解决了,记录一下以免再忘. 1. 确认crond服务已启动 有些linux系统是cron,比如CentOS,功能与crond相同 service crond restart service crond status 正常应显示: crond start/running, process xxx 2. 添加crontab任务 crontab -uroot -e 进入编辑界面后添加环境变量设置,以及指定的任务: