Linux内核6.3.1添加系统调用:Makefile修改与安装失败解决
问题描述
我正在完成一项作业,给Linux内核添加一个系统调用,功能是将输入的数字乘以10。参考的指南针对Linux 5.8.1内核,但我使用的是6.3.1版本。除了指南里修改主Makefile的步骤外,其他流程都正常。
指南要求修改主Makefile第1073行,在core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/这一行添加系统调用路径,但我的6.3.1内核Makefile里找不到这一行,搜索core-y仅在第741行看到core-y :=。我把系统调用路径加到这一行后,sudo make和sudo make modules_install都执行成功,但运行sudo make install时出现错误:
amir@99312201:~/linux-6.3.2$ sudo make install INSTALL /boot *** Missing file: arch/x86/boot/bzImage *** You need to run "make" before "make install". make: *** [arch/x86/Makefile:292: install] Error 1
请问应如何修改Makefile以关联我的系统调用?还需要执行哪些额外步骤?
解决方案
一、正确修改Makefile关联系统调用
Linux 6.x内核的主Makefile中core-y的组织方式和5.x不同,不要直接修改core-y :=那一行,正确操作如下:
- 在主Makefile中搜索
core-y +=,找到类似这样的行:
如果没找到,就在core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/core-y :=这一行的下方新增一行,把你的系统调用代码所在目录加进去,比如你的代码放在kernel/mymultiply/下,就写:core-y += kernel/mymultiply/ - 确保你的自定义目录下有独立的
Makefile,内容至少包含:
其中obj-y += mymultiply.omymultiply.o是你的系统调用实现文件对应的目标文件。
二、解决make install的错误
你遇到的bzImage缺失问题,看似矛盾(已执行make),实际原因及解决步骤:
- 先清理旧编译产物,避免残留问题:
sudo make clean sudo make mrproper - 重新配置内核(复用当前系统的配置即可):
cp /boot/config-$(uname -r) .config make menuconfig # 直接保存退出,无需额外修改 - 重新编译内核,明确指定生成
bzImage:sudo make -j$(nproc) bzImage sudo make -j$(nproc) modules - 再次执行安装流程:
sudo make modules_install sudo make install - 如果仍找不到
bzImage,手动检查arch/x86/boot/bzImage是否存在,若不存在,查看编译日志是否有报错,或尝试用make vmlinux替代make bzImage(部分内核配置下生成的是vmlinux而非压缩后的bzImage)。
三、额外必做步骤
- 注册系统调用号:Linux 6.x的x86架构中,64位系统调用号定义在
arch/x86/entry/syscalls/syscall_64.tbl,32位在syscall_32.tbl,需添加你的系统调用号、名称和对应函数。 - 声明函数原型:在
include/linux/syscalls.h中添加系统调用的函数声明,比如:asmlinkage long sys_mymultiply(int num); - 验证功能:安装完成后重启系统,用
uname -r确认内核版本,编写测试程序调用你的系统调用验证乘法功能。
内容的提问来源于stack exchange,提问作者Amirreza A.
相关产品推荐
相关产品推荐

