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

前言

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

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

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

内核编译

0.查看内核版本

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

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

1.下载内核源码

链接: kernel官网
选一个和当前机器不同版本的内核下载进行编译、替换测试

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-get install libncurses5-dev

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

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

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

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

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

# 编译好的模块拷贝到系统目录下(默认是/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

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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux内核源码编译是将Linux内核源代码编译成可执行内核的过程。编译过程需要先安装必要的编译工具和依赖库,然后使用make命令进行编译编译完成后,可以将生成的内核镜像文件安装到系统中,以更新现有的内核版本或者创建新的内核版本。编译过程需要一定的技术和经验,建议在进行编译前先了解相关知识和文档。 ### 回答2: Linux内核是一个开放源代码的操作系统,它的内核源码可以通过网络从github等网站下载,因此也允许用户对源码进行修改。当用户对内核源代码进行修改之后,需要编译新的内核并将其安装到系统中,以应用修改所带来的变化。 首先,下载内核源码,可以通过以下指令在Linux终端中下载 ``` $ git clone https://github.com/torvalds/linux.git ``` 下载完成之后,进入源码根目录 ``` $ cd linux ``` 然后,在终端中运行make menuconfig命令,进入配置界面。在这个界面,可以选择需要编译内核中的功能、驱动和选项,也可以取消需要的功能等选项。完成之后,保存并退出配置界面。 接下来就是正式编译的过程。 先清除上次编译的结果 ``` $ make clean ``` 编译时可以指定对应的平台,可以通过以下命令指定: ``` $ ARCH=arm make xyz ``` 其中xyz指的是编译的目标,比如all表示编译全部内容,zImage表示编译内核文件,modules表示编译驱动模块, bzImage表示编译完整的内核文件等等。 编译完成之后,安装内核和驱动模块等文件: ``` $ sudo make modules_install && sudo make install ``` 这个命令会将编译好的内核镜像文件bzImage复制到/boot目录下,并为其设置一个名为config-<版本号>的配置文件。 最后,重新启动计算机,新的内核就会生效了。 编译内核源码需要一定的编程知识和经验,一些依赖包等也需要提前安装。此外,除非你确实需要修改内核,否则,在编译之前最好想清楚是否真的需要对内核源代码进行多大的修改。 ### 回答3: Linux内核是开源软件,它的源代码是公开且可自由使用的。编译Linux内核源代码就是将源代码翻译成计算机可以执行的机器语言的过程。 Linux内核源代码编译主要包括以下几个步骤: 1. 下载内核源码:从官方网站或其他可靠资源中获取内核源码,根据需要选择合适的版本。 2. 配置内核:使用make menuconfig工具打开Kernel Configuration Utility,根据系统硬件和需要进行内核的配置。配置完成后,保存并退出。 3. 编译内核:使用make命令编译内核,这个过程可能需要一些时间,过程中会生成一些文件(包括压缩镜像文件和应用程序的固件二进制文件等)。 4. 安装内核:使用make install命令将编译后的内核安装到系统中,建议在安装前进行备份。 5. 更新启动引导程序:重新载入启动引导程序(如Grub),以确保新内核可以正常启动。 在编译内核时,需要注意以下问题: 1. 建议使用最新版的编译器。 2. 系统要求:要求系统已经安装了必要的开发工具和库文件,如GCC编译器、make、ncurses和zlib等库文件。 3. 如果编译失败,请查看编译日志,根据错误提示解决问题。 总之,Linux内核源码编译需要一定的技术水平和耐心,但是掌握这个技能对于研究和开发Linux操作系统具有重要的价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值