RETURN_TO_GRID
Linux2025-06-245 MIN READ

内核安装编译

好的,下面是适用于 Ubuntu 22.04 的完整实验步骤,分为四大阶段,遵循先编译运行内核、再添加系统调用的要求。建议在虚拟机中操作,以防止系统崩溃。


🧪实验前准备

安装依赖工具

text
sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc

1️⃣ 查看当前 Linux 内核版本 & 获取源码

1.1 查看当前内核版本

text
uname -r

例如输出:5.15.0-100-generic

1.2 下载内核源码(与当前或更新版本匹配)

text
cd /usr/src/
sudo wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.154.tar.xz
sudo tar -xvf linux-5.15.154.tar.xz
cd linux-5.15.154

2️⃣ 编译原始内核(不添加系统调用)

2.1 使用当前系统配置

text
cp -v /boot/config-$(uname -r) .config

2.2 配置内核

text
make olddefconfig    # 使用默认选项快速配置

2.3 编译内核(会花较长时间)

text
sudo make -j$(nproc)//到这步了

2.4 安装内核模块 & 构建安装包

text
sudo make modules_install
sudo make install

2.5 更新 grub 启动引导

text
sudo update-grub

2.6 重启并选择新内核启动

text
sudo reboot

DATA_TABLE
检查方式输出启动模式GRUB 菜单进入方式
[ -d /sys/firmware/efi ]存在目录UEFI重启时按 Esc
[ -d /sys/firmware/efi ]不存在目录BIOS重启时按 Shift
efibootmgr正常显示引导项UEFIEsc
efibootmgr报错无 EFI 变量BIOSShift

2.7 确认新内核是否生效

text
uname -r

3️⃣ 添加系统调用(再编译)

3.1 添加 syscall 源文件

编辑文件:

text
cd /usr/src/linux-5.15.154
sudo vim kernel/mysyscall.c

内容如下(请把zhangsan改为你的名字拼音全拼):

text
#include <linux/kernel.h>
#include <linux/syscalls.h>

SYSCALL_DEFINE1(double_int, int, num)
{
    printk(KERN_INFO "syscall by: zhangsan\n");
    return num * 2;
}

3.2 修改内核 Makefile 以编译新系统调用

编辑:

text
sudo vim kernel/Makefile

在末尾添加:

text
obj-y += mysyscall.o

3.3 添加系统调用号(选择一个未使用的)

编辑 syscall 表:

text
sudo vim arch/x86/entry/syscalls/syscall_64.tbl

添加一行(假设编号为 548):

text
548	common	double_int	__x64_sys_double_int

4️⃣ 重新编译并安装新内核

重复 2️⃣ 编译步骤:

text
sudo make -j$(nproc)
sudo make modules_install
sudo make install
sudo update-grub
sudo reboot

确认内核是否加载成功:

text
dmesg | grep zhangsan

5️⃣ 编写用户测试程序

5.1 获取系统调用号

确保你知道自己在 syscall_64.tbl 添加的是哪一行(如 548)

5.2 创建测试程序

text
#include <stdio.h>
#include <sys/syscall.h>
#include <unistd.h>

#define SYS_double_int 548  // 替换为你在表中设定的编号

int main() {
    int input = 10;
    long result = syscall(SYS_double_int, input);
    printf("Result of custom syscall with input %d: %ld\n", input, result);
    return 0;
}

保存为 test_syscall.c 并编译:

text
gcc test_syscall.c -o test_syscall
./test_syscall

5.3 检查 dmesg 输出

text
dmesg | tail

应显示:

text
syscall by: zhangsan

✅ 总结

DATA_TABLE
阶段操作内容
第一步查看内核版本、下载源码
第二步编译未修改的内核,验证能正常运行
第三步添加自定义系统调用并修改表
第四步重新编译安装内核并测试系统调用

是否需要我为你生成所有操作的 Shell 脚本或测试代码?可以更方便直接执行。

END_OF_FILESLUG: Linux学习/内核安装编译
# COMMENTS