(在网上看了好多,然后完成了实验,写这篇记录一下所学)
主要参考的是以下两篇教程,当然有些是我自己的经验
https://www.cnblogs.com/tsruixi/p/10777242.html
https://blog.csdn.net/zyf2333/article/details/80043152?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1
实验一 linux 内核编译及添加系统调用
内容要求
添加一个系统调用,实现对指定进程的 nice 值的修改或读取功能,并返回进程最 新的 nice 值及优先级 prio。建议调用原型为:
int mysetnice(pid_t pid, int flag, int nicevalue, void __user * prio, void __user * nice);
正文
- ctrl+Alt+T进入命令行,输入以下代码,就可以下载
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.16.1.tar.xz
一般来说,在home文件夹里可以看见我们刚刚下载好的压缩包
我在home 文件夹下新建一个Linux文件夹,将压缩包拉入其中,右键直接解压
-
我们这个实验有三个文件需要修改(大家也可以从命令行进去,不过我懒,就直接找到文件打开修改了)
1、arch/x86/entry/syscalls/syscall_64.tbl
作用是分配系统调用号
这里面我们需要加上一行333 64 mysetnice sys_mysetnice
2、include/linux/syscalls.h
作用是添加服务例程的原型声明
然后拉到最后,加上一行asmlinkage long sys_mysetnice(pid_t pid, int flag, int nicevalue, void __user* prio, void __user* nice);
3、 kernel/sys.c
作用是实现系统调用服务例程
添加代码SYSCALL_DEFINE5(mysetnice, pid_t, pid, int, flag, int, nicevalue, void __user *, prio, void __user *, nice) { struct pid * kpid; struct task_struct * task; int