嵌入式Linux学习-编译内核源码
嵌入式Linux学习-编译内核源码
1.给虚拟机添加新硬盘
2.打开虚拟机,创建分区,一开始输入了fdisk之后一直输入n,最后w保存
sudo fdisk /dev/sdb
3.把分区写进硬盘
sudo partprobe /dev/sdb
sudo partprobe /dev/sdb
4.格式化分区并挂载
mkfs.ext4 /dev/sdb1 #格式化
mkdir /sdb #创建挂载点
mount /dev/sdb1 /sdb #挂载
#设置自动挂载
vi /etc/fstab
# 添加如下信息:
/dev/sdb1 /sdb ext4 defaults 0 0
5.下载内核源码并上传
用uname -r命令,可以看到示例输出如下:
5.15.0-76-generic,其格式通常为版本.次版本.修订版本-发行版后缀(如 5.15.0-76-generic)
下载主次版本一致的内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.tar.xz
如果虚拟机网速较慢,可以将上述链接复制到自己电脑的浏览器上下载。
然后上传到刚刚创建的分区、解压。
6.内核环境配置
make mrproper #内核源码在编译之前需要对源代码树进行清理,第一编译使用make mrproper 命令进行清理
sudo apt install libncurses-dev
#复制本机的内核配置文件到新内核目录
cp /boot/config-5.15.0-134-generic .config
#执行
make menuconfig
在这里可以选择禁止自己不需要的模块,也可以使能需要的模块,比方说无线网卡驱动,或者选择使用ext3还是ext4文件系统。ext3(Third Extended Filesystem)
在这里选择M还是*的区别如下:
特性 | *(Built-in) | M(Module) |
---|---|---|
编译位置 | 直接嵌入内核镜像 | 生成独立的 .ko 模块文件 |
加载方式 | 开机时自动加载 | 手动加载或按需自动加载 |
内核体积影响 | 增加内核大小 | 保持内核精简 |
适用场景 | 关键功能(如文件系统、核心驱动) | 非必需功能(如外设驱动、调试工具) |
运行时灵活性 | 不可卸载 | 可动态加载/卸载 |
在该界面可以进行内核裁剪,在满足功能需求的前提下,让内核尽可能轻量化。如果不确定某个选项的作用,可通过 查看描述,或暂时设为模块(M)观察影响。 |
我这里给它打上补丁
从以下网址下载对应版本的实时补丁
https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/older/
cd /path/to/linux-5.15
sudo bash -c 'for patch in patches/000*.patch; do patch -p1 < "$patch"; done'
在这个地方有冲突
cat查看一下,然后修改下图所示689行的代码
需要按照提示将.net/sched/sch_ets.c的相应代码改掉。
7.编译
sudo make -j4
可能会报错如下
/sdb/linux-5.15/tools/objtool/include/objtool/elf.h:10:10: fatal error: gelf.h: No such file or directory10 | #include <gelf.h>
执行以下代码即可
sudo apt install libelf-dev
#编译
sudo make modules_install
sudo make install
编译完成,可以reboot进入自己编译的系统了
问题记录:
reboot完没有看到自己编译的系统,可能需要确保GRUB包含自定义的内核。
GRUB是什么?
GRUB 是一个用于加载和管理系统启动的完整程序。它是 Linux 发行版中最常见的引导程序(bootloader)。
sudo update-grub
输出如下
总结流程大致为:下载内核源码->配置内核(打补丁?)->编译->安装内核模块->安装->更新bootloader
启动,长按shift,找到自己编译的系统