Linux内核编译

发布于 2021-04-25  671 次阅读


《Linux相关》目录

Linux内核编译实验,编译同时添加一个系统调用函数

  • 系统:Ubuntu 18.04
  • 新增内核版本:5.10.29
  • 需要:40G左右的空间

1.进入/usr/src文件夹,使用wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.10.29.tar.gz命令下载文件压缩包(这里为了方便博主使用root用户进行实验,推荐使用普通用户,在每条命令前加上sudo)

2.使用tar -zxvf linux-5.10.29.tar.gz命令解压压缩包

3.执行make menuconfig命令进行内核功能选择

此处博主进入了General setup选项,并更改第二条选项,在内核版本号后追加字符串timer

使用左右键选择Save保存设置,然后选择Exit退出,产生.config文件

4.添加系统调用函数

使用gedit arch/x86/entry/syscalls/syscall_64.tbl命令添加系统调用ID,这里添加的系统调用ID为335,函数名称为myprint

使用vi include/linux/syscalls.h命令添加函数声明,这里要注意函数前要加__x64_(通过查阅资料,似乎是5.10.17之后有这个问题,不添加会报错:arch/x86/entry/syscall_64.o:(.rodata+0xa78):对‘__x64_sys_myprint’未定义的)

使用vi kernel/sys.c命令进行函数定义,先在开始引入头文件,在最后添加自定义函数,注意函数前要加__x64_

5.编译内核并安装(该步骤需要进入漫长的等待,数小时左右,视性能而定)

使用make命令进行编译,-j用来设置并行编译的进程数,一般为CPU个数的二倍

使用make modules_install命令进行模块安装

使用make install命令安装内核

安装成功后重启虚拟机,进入时按住shift键,选择高级选项,并选择编译好的内核(进入后默认的第一个)

在这里的时候出现了一个报错:end kernel panic - not syncing:System isdeadlocked on memory,是因为虚拟机内存不足,将内存调高后错误消失

使用uname -r命令查看内核版本,安装成功

6.测试系统调用函数

编写test.c文件,注意这里syscall函数内的第一个变量为上面自己设置的系统调用ID

编译test.c文件

执行

通过dmesg命令查看系统启动信息,用来查看系统调用函数是否成功写入

最后成功显示自定义系统调用函数输出的字符串,至此内核编译成功


人生就像赛跑,不在乎你是否第一个到达终点,而在乎你是否跑完全程。