验证编辑编译内核的流程,并增加新的系统调用
注意:需要/目录至少10GB空间,/boot目录500MB空间
下载内核并解压
kernel下载
百度云搬运 密码: qc8b
进入 /usr/src目录
tar -xvf linux-4.13.10.tar.xz
cd linux-4.13.10
添加系统调用号
vim ./arch/x86/entry/syscalls/syscall_64.tbl(32位系统是syscall_32.tbl)
声明系统调用函数原型
vim ./include/linux/syscalls.h
其中的asmlinkage用在大多数的系统调用中。在一些情况下是需要明确的告诉编译器使用stack来传递参数,X86中的系统调用是先将参数压入stack以后调用sys_函数的,所以所有的sys_函数都有asmlinkage来告诉编译器不要使用寄存器来编译。
添加系统调用函数的定义
vim kernel/sys.c 末尾添加
编译
make menuconfig
(缺失ncurses,sudo apt-get install libncurses5-dev,)选择save 然后exit
make clean
make -jn
并行编译,加快编译速度,n=cpu核心数×2,双核即-j4
scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: 没有那个文件或目录 sudo apt-get install libssl-dev
作为参考,i5-6200u 2.8GHZ需要40min左右
安装
make modules
make modules_install 安装模块
make install 安装内核
update-grub
测试
重启选择新的内核(grub引导界面选择ubuntu高级设置,选择linux-4.13.10)
进入后可uname -a确认内核版本
#include<stdio.h>
#include<unistd.h>
int main()
{
int a=syscall(333,2);
printf("system call return %d\n",a);
return 0;
}
编译后运行返回2,并在日志中打印hello world