Linux--内核编译流程+系统调用(ubuntu)

1、安装必要库依赖:

sudo apt-get upgrade

sudo apt-get install libncurses5-dev

sudo apt-get install openssl

apt-get install libssl-dev

sudo apt-get install build-essential

sudo apt-get install pkg-config

sudo apt-get install libc6-dev

sudo apt-get install bison

sudo apt-get install flex

sudo apt-get install libelf-dev

sudo apt-get install zlibc minizip

sudo apt-get install libidn11-dev libidn11

sudo apt-get install ystd

2、下载并解压内核:

cd /usr/src

wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.12.9.tar.xz

 

由于下载的内核为*tar.xz文件,所以执行命令:

tar -xavf  linux-5.12.9.tar.xz  -C /usr/src

3.添加系统调用:

(1)声明系统调用

vim arch/x86/entry/syscalls/syscall_64.tbl(32位系统选择32.tbl,64位系统选择64.tbl)

 345     64      mysyscall               sys_mysyscall

 

 号需要未被使用,每个字符串之间tab,不是空格键,最后一列建议跟上文保持一致,没有__64_的,直接sys开头就行。

(2)加入函数声明:

vim include/linux/syscalls.h

shift +g到最后一行:

asmlinkage  long  sys_mysyscall(void);

 

 

(3)编写函数

vim kernel/sys.c

最后一行定义一下:

4、编译前处理(在内核目录下执行):

进入内核目录:cd /usr/src/linux-5.12.9

(1)make mrproper

make clean

(2)终端中使用root权限使用命令#gedit .config

CONFIG_SYSYTEM_TRUSTED_KEY= "debian/canonical-certs.pem"将“”中内容清空

CONFIG_DEBIG_INFO_BTF = y  ,将 y 改为 n

处理完后make menuconfig进入菜单

此处可能报错,一种原因是前面提到的包未安装,另一种是窗口太小无法显示。

开头说明括号内的符号什么意思,大家可以根据自己的需要进行勾选,或者参考网上的裁剪示例进行内核编译。如果默认save的话编译下来大概20g不到,不同版本具体大小不同。

我这里步骤是这样的:

load  ->  save  -> exit  -> exit

5、编译内核和模块以及安装:

make bzImage

编译完成后会在arch/x86/boot路径下生成bzImage文件,即编译出来的新内核

执行make install将其移动到boot路径下

接下来执行命令make modules来编译这些模块

最后执行命令make modules_install将内核模块安装到/lib/modules中

6、添加启动项

mkinitramfs /lib/modules/5.12.9 -o /boot/initrd.img-5.12.9-generic

cp /usr/src/linux-5.12.9/arch/x86/boot/bzImage  /boot/vmlinuz-5.12.9-generic

cp  /usr/src/linux-5.12.9/System.map  /boot/System.map-5.12.9

进入/boot/grub/ 然后执行update-grub2 更新grub目录

7、设置  /etc/default/grub:(改变系统启动是启动项加载时间)

cd  /etc/default/grub

GRUB_DEFAULT=2

GRUB_TIMEOUT=10

#GRUB_TIMEOUT_STYLE=hidden

GRUB_CMDLINE_LINUX_DEFAULT="text"

然后执行

sudo update-grub

重启系统:

reboot

8.进入新内核版本,并进行测试:

重启后进入该界面,不同版本显示的内容可能有所区别

选择第二项(高级选项:)

选择不带(recovery mode)的,新下载的内核的选项

#uname -r查询  5.12.9 (内核版本号)

说明内核更换成功!!!

编写测试程序:

编写test.c测试文件

测试程序需要将系统调用号修改成自己添加的

 

编译运行该测试文件:

如果出现问题,根据报错信息修改测试程序或者查看三个部分(系统调用表、结构体、函数声明)是否书写有错,对应文件目录是否有错,然后重新编译内核。

可能遇到的问题:

(1)磁盘容量不足,需要扩容

解决:

可以参考这篇文章

vmware:ubuntu虚拟机如何扩容?_vmware ubuntu scsi硬盘扩容-CSDN博客

但如果在编译内核时提示内存已满,且不小心把虚拟机关机,再次打开进不去系统的时候,可以在开机时,进入bois模式下,具体进入该模式下的几种方法,可以参考这篇文章:

真没想到,vmware进入 bios设置 的方法是这样的_vmware bios-CSDN博客

接着具体操作可以参考这篇文章:

[Linux] VMware虚拟机开机后直接进入memtest_虚拟机开机出现memtest-CSDN博客

(2make modules_install时可能会有报错

可能会提示:Linux内核编译错误:make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list 需求。 停止。

推测是由于在解决make环节的报错make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止时将CONFIG_MODULE_SIG_KEY与CONFIG_SYSTEM_TRUSTED_KEYS均置空的操作导致。 CONFIG_MODULE_SIG_KEY的置空可能会引起make modules_install的报错。

解决:

终端中使用root权限使用命令#gedit .config

        CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"恢复后解决。(也可重置.config配置解决,注意CONFIG_SYSTEM_TRUSTED_KEYS仍需置空)

CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem" #这个要删除

(3)报错:FAILED:load BTF from vmlinux:No such file or directory

解决:

终端中使用root权限使用命令#gedit .config

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,我们需要下载Linux系统内核。打开终端,输入以下命令: ``` wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.12.10.tar.xz ``` 这会下载Linux内核的tar.xz压缩包。接着,我们需要解压缩它: ``` tar -xvf linux-5.12.10.tar.xz ``` 进入解压缩后的目录: ``` cd linux-5.12.10/ ``` 现在,我们需要为内核添加自己的系统调用。打开文件`arch/x86/entry/syscalls/syscall_64.tbl`,在文件末尾添加以下一行: ``` <syscall_number> 64 <syscall_name> __x64_sys_<syscall_name> ``` 在这里,`<syscall_number>`是你要添加的系统调用的编号,`<syscall_name>`是你要添加的系统调用的名称。例如,如果你的姓名拼音是“zhangsan”,你可以添加以下一行: ``` 400 zhangsanSYSCALL __x64_sys_zhangsanSYSCALL ``` 接着,我们需要在内核中实现这个系统调用。打开文件`arch/x86/entry/syscalls/syscall_64.c`,在文件末尾添加以下一段代码: ``` SYSCALL_DEFINE0(zhangsanSYSCALL) { printk(KERN_INFO "My name is zhangsan, and my student ID is 123456.\n"); return 0; } ``` 这个代码段实现了一个名为`zhangsanSYSCALL`的系统调用,当它被调用时,内核会打印输出自己的姓名和学号。 现在,我们可以编译内核了。在终端中输入以下命令: ``` make menuconfig ``` 这会打开一个菜单界面,让你选择内核的配置选项。在菜单中选择“Save”保存配置,然后退出菜单。 接着,输入以下命令编译内核: ``` make -j4 ``` 这会使用4个线程编译内核。这个过程可能需要一段时间,取决于你的电脑性能。 编译完成后,输入以下命令安装内核: ``` sudo make install ``` 这会把编译好的内核安装到你的系统中。 现在,我们需要重启电脑,以便使用新的内核。在终端中输入以下命令: ``` sudo reboot ``` 重启完成后,你可以在终端中输入以下命令测试你的系统调用: ``` sudo zhangsanSYSCALL ``` 这会打印输出你的姓名和学号。 至此,你已经成功地为Linux内核添加了自己的系统调用,并在Ubuntu系统中进行了内核编译

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值