1、 准备工作
a. 安装相关编译程序
sudo apt-get install build-essential kernel-package libncurses5-dev
注:我这里是之前已经安装完了
b. 获取内核源代码
可以在官网下载,下面附上国内比较好用的下载地址。 内核源代码下载网站 http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v4.x/ 这里我下载的是:linux-4.16.tar.gz 将源代码移动到 /usr/src/
sudo mv /xx/xx/linux-4.16.tar.gz /usr/src/
c. 解压源代码
cd /usr/src
sudo tar -zxvf /usr/src/linux-4.16.tar.gz
2、编辑 sys.c 加入函数
sudo gedit /usr/src/linux-4.16/kernel/sys.c
在文件末尾添加如下函数,并保存,在终端窗口按`ctrl + c’ 退出
asmlinkage long sys_helloworld(void) {
printk("hello world!");
return 1;
}
3、添加声明
sudo gedit /usr/src/linux-4.16/arch/x86/include/asm/syscalls.h
插入如下声明
asmlinkage long sys_helloworld(void);
4、添加系统调用id
sudo gedit /usr/src/linux-4.16/arch/x86/entry/syscalls/syscall_64.tbl
添加如下行
333 64 helloworld sys_helloworld
5、配置内核
cd /usr/src/linux-4.16
sudo make mrproper
sudo make clean
sudo make menuconfig
make -j8
sudo apt-get install libssl-dev
make -j8
编译成功截图
6、安装内核
sudo make modules_install
sudo make install
安装成功截图
7、重启虚拟机
将之前的工作保存后直接重启,重启后点击鼠标进入ubuntu并且迅速长按shift,进入内核选择界面 选择 Advanced options for ubuntu,选择你编译好的内核,enter进入
8、验证
新建文件,输入如下代码
#include <stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
int main()
{
long int a = syscall(333);
printf("System call sys_helloworld return %ld\n", a);
return 0;
}
# 编译
gcc hello.c
打开另一个终端查看内核日志
dmesg -wH | grep "hello"
运行
./a.out
效果截图
|