前言
做这个作业我重装了无数次虚拟机、等待了无数次漫长的编译,被磨的都没有脾气了。希望可以帮助同学们尽快完成作业,不花费过多的时间。
任务:在Linux(建议麒麟版本)下为内核增加3个新的系统调用,并启用新的内核,并编写应用程序测试。(其他发行版本也可以)
◆提示1:int Max(int,int,int);int GetPID();char*GetCMD();
◆提示2:内核编译和重启参考任务1.
◆提示3:如果使用makefile方式修改源代码,则参考提示4,5,6。
如果直接修改源文件,在源文件中添加新内核函数,则忽略提示4,5,6。
◆提示4:主目录下建NewCall目录并在其中新建MyNewcall.c文件和相应的makefile文件。c文件含
有系统调用的实现函数。makefile文件内容:obj-y := MyNewcall.o
◆提示5:将NewCall目录添加到主makefile中的特定位置:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ NewCall/
◆提示6:在syscall_64.tbl和syscalls.h中分别定义编号和声明函数。
◆提示7:在应用程序中使用下面方式调用:
int nRet = syscall(548, 20,18); // nRet = 38
int nRet = syscall(549, 20,18, 4); // nRet= 20
作者linux版本为linux-6.6.22
修改文件
首先,进入linux-6.6.22文件夹
cd /usr/src/linux-6.6.22
1.添加系统调用ID
sudo vim arch/x86/entry/syscalls/syscall_64.tbl
按shift+G快捷键可快速到达文件底端
添加编号为548,549,550的系统调用id
2.添加系统调用函数声明
sudo vim include/linux/syscalls.h
在底端添加如下代码
3.在内核源代码中添加函数定义
sudo vim kernel/sys.c
在底端添加如下代码
4.添加声明
sudo vim include/uapi/asm-generic/unistd.h
添加548,549,550
编译内核
还是在/usr/src/linux-6.6.22目录下
sudo make mrproper
sudo make clean
sudo make menuconfig
使用menuconfig--个性化配置时,笔者没有修改, 直接Save-->OK,然后Exit 。
sudo make -j4
sudo make modules_install
sudo make install
sudo update-initramfs -c -k 6.6.22
sudo update-grub
reboot
sudo make -j4 编译过程可能需要等候较长时间,笔者的电脑用了40min左右。
最后直接reboot重启电脑就可以了。
文件测试
新建测试文件test.c
sudo vim test.c
输入测试文件:
#include<unistd.h>
#include<sys/syscall.h>
#include<stdio.h>
int main()
{
long a,b;
a=syscall(548,20,18,6);
printf("max:%ld\n",a);
b=syscall(549);
printf("id:%ld\n",b);
syscall(550);
return 0;
}
编译运行该文件
sudo gcc -o test test.c
sudo ./test
输出正确!
然后打开另一个终端,并输入:
sudo dmesg -wH | grep "test"
来查看日志,可看到系统调用编号550的结果,与预期相同。
OK,增加系统调用的实验到这里就告一段落了。
参考文章:
【优麒麟】编译linux kernel + 增加系统调用 + 编写批处理脚本_在优麒麟中编译新内核-CSDN博客
linux内核添加系统调用(详细)_采用编译内核法,在linux中增加一个系统调用。 要求: (1)系统调用实现的功能:计算-CSDN博客