linux向内核中添加系统调用1
操作系统项目:向Linux内核添加一个系统调用
实验环境:
VMware workstation 16
ubuntu 20.04.1
系统内核:linux 5.4.0
修改的内核:linux 5.4.5
一,配置环境
一股脑装就完了,也不知道到底哪个有用23333,不懂不懂
apt-get install libncurses5-dev libssl-dev build-essential openssl zlibc minizip libidn11-dev libidn11 flex bison
二,下载内核源码
我是在下面这个地方下载的:
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
三,添加一个简单的helloworld函数
1 添加声明 .../linux-5.4.5/arch/x86/include/asm/syscalls.h
asmlinkage void sys_helloworld(void);
2 添加函数 .../linux-5.4.5/kernel/sys.c
asmlinkage void sys_helloworld(void)
{
printk("hello Li speaking from core\n");
}
3 添加调用号 .../linux-5.4.5/arch/x86/entry/syscalls/syscall_64.tbl
336 64 helloworld sys_helloworld
四,编译修改好的内核源码
1 删除无用文件
sudo make mrproper
sudo make clean
2 生成配置文件.config
此处进去直接save,然后exit,生成一个默认的.config即可
sudo make menuconfig
3 编译
j4是指用4核编译,查的说是可以加快编译速度,不过我也没有具体对比验证
sudo make -j4
4 安装
sudo make modules_install
sudo make install
五,重启使用新内核
reboot
然后直接按住shift不放,就会进入grub(手速不够的请再来一遍...)
六,测试新的系统调用
随便找个地方写个main.cpp
#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
#include<sys/types.h>
int main()
{
syscall(336);
return 0;
}
gcc main.cpp -o main.o
运行main.o后你会发现什么也没有输出到屏幕,因为系统调用的printk输出到了syslog中了。
位置在/var/log/syslog
可以直接
gedit /var/log/syslog
然后ctrl+f,找hello