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

文章目录