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 | 正常显示引导项 | UEFI | Esc |
efibootmgr | 报错无 EFI 变量 | BIOS | Shift |
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