Linux内核开发-编译内核源码

前言

大部分公司的所谓的Linux内核工程师主要工作是基于社区开源内核进行定制化修改,基本不会有机会向上游提供patch,仅限于公司内部业务的修修补补。

作为内核开发工程师两年多,精力一直被公司业务消耗,所有的内核知识都来自于公司业务驱动学习,一切编译都在SDK环境下进行,从未自己进行社区版本的内核进行编译。

本专题主要记录自己的学习过程。

内核编译

0.查看内核版本

我本地的开发环境是全新安装的Ubuntu18.04,本次学习目标是替换内核版本。先查看当前的内核版本:

cat /proc/version
结果:Linux 5.3.0-28-generic

1.下载内核源码

链接: kernel官网
选一个和当前机器不同版本的内核下载进行编译、替换测试
或者直接使用下面的方式拉取代码:

git clone https://github.com/torvalds/linux.git

2.解压

tar -xvf linux-5.10.219.tar.xz

3.编译

# 切换到源码目录
cd linux-5.10.219/

# 编译准备:机器刚装上系统还没有编译器
sudo apt install gcc

# 内核编译配置,生成.config文件,后续可以直接修改.config文件跳过此步骤直接进行编译
make menuconfg

# 编译,-j代表并行编译;开并行能显著提速,但是出错时得往前翻编译log(社区稳定版本一般不会有代码编译错误)
make -j$(nproc)

# 初次编译一般会报错,都是缺少一些依赖库导致的,复制报错信息查一下即可,以下是我遇到的报错以及解决方式
# 报错:Unable to find the ncurses package. recipe for target ‘scripts/kconfig/.mconf-cfg‘ failed
# sudo apt install libncurses5-dev

# 报错:/bin/sh: 1: flex: not found
# sudo apt install flex

# 报错:/bin/sh: 1: bison: not found
# sudo apt install bison flex

# 报错:/bin/sh: 1: xxd: not found
# sudo apt install xxd

# 报错:fatal error: openssl/opensslv.h: No such file or directory
# sudo apt install libssl-dev

# 报错:fatal error: gelf.h: 没有那个文件或目录
# sudo apt install libelf-dev

# 报错:Failed to generate BTF for vmlinux
# sudo apt install dwarves

# 报错:"mkimage" command not found – U-Boot images will not be built
# sudo apt install u-boot-tools

# 至此已经编译完成了,但是为了后续替换内核版本,继续执行如下指令

# 编译好的模块拷贝到系统目录下(默认是/lib/modules/)
make modules_install
# 安装
make install

4.查看编译结果

源码目录下已经生成了内核Image文件:
在这里插入图片描述
各个模块的目录,可以看到已经生成了*.o文件:

myname@myname-VirtualBox:~/file/linux-5.10.219/net/bridge$ ll
总用量 3596
drwxr-xr-x  3 myname myname   4096 619 22:15 ./
drwxr-xr-x 72 myname myname   4096 619 21:43 ../
-rw-r--r--  1 myname myname  11685 616 19:32 br_arp_nd_proxy.c
-rw-rw-r--  1 myname myname  10400 619 21:41 br_arp_nd_proxy.o
-rw-rw-r--  1 myname myname  61147 619 21:41 .br_arp_nd_proxy.o.cmd
-rw-r--r--  1 myname myname   8994 616 19:32 br.c
-rw-r--r--  1 myname myname  11891 616 19:32 br_device.c
-rw-rw-r--  1 myname myname  17192 619 21:40 br_device.o
......

切换到/lib/modules/下,随便进一个模块,可以看到ko产物已经拷贝到此目录下了

myname@myname-VirtualBox:/lib/modules/5.10.219/kernel/net/bridge$ ll
总用量 392
drwxr-xr-x  3 root root   4096 618 20:50 ./
drwxr-xr-x 58 root root   4096 618 20:50 ../
-rw-r--r--  1 root root 355001 618 20:50 bridge.ko
-rw-r--r--  1 root root  31489 618 20:50 br_netfilter.ko
drwxr-xr-x  2 root root   4096 618 20:50 netfilter/

#清理编译产物
make clean

下一章:替换内核版本(点击进入下一章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值