乐于分享
好东西不私藏

Linux内核源码构建简介

Linux内核源码构建简介

在Linux内核的编译过程中,.config文件是整个构建系统的核心配置输入。它决定了内核的每一个功能是编译进内核内部(=y),还是编译成独立的模块(=m),或是完全忽略(=n)。

生成.config

有以下几种方法:

1、如果是桌面系统,可以复制/boot下的config-xxx文件,重命名为.config。

2、使用预定义配置,这些配置文件存放在内核源码的 arch/<架构>/configs/ 目录下

使用命令make ARCH=xxx yyy_deconfig即可将yyy_deconfig复制为.config。

3、通过make menuconfig手动配置,执行后会出现下面的菜单界面,可以浏览所有内核功能并修改状态,修改后选择 Save,就会保存到 .config 文件中。

交叉编译时每次输入ARCH=xxx CROSS_COMPILE=xxx比较麻烦,可以用以下几种办法解决

1、把这俩参数添加到.bashrc中

2、创建专用构建脚本

创建build.sh脚本,把固定的参数写进去,然后通过这个脚本来编译。

优点:灵活性极高,可以在一个源码目录里放多个不同平台的构建脚本(比如 build_arm.sh、build_x86.sh),互不干扰。同时脚本里还可以添加其他常用选项。

3、直接添加到Makefile中

这样可以直接使用make而不需要指定这两个参数了。

内核make常用目标

帮助

make help:打印出所有的命令帮助信息

清除

clean、mrproper 和 distclean 是三个常用的清理目标,它们依次删除越来越多的生成文件,使源码树回到不同的“干净”程度。

make clean:删除大部分编译过程中生成的中间文件,但保留配置文件(如 .config)和一些辅助文件。

make mrproper:在 clean 的基础上,进一步删除配置文件、备份文件等,使源码树恢复到打补丁前的状态(但保留原始源码)。

make distclean:在 mrproper 的基础上,删除几乎所有非源码文件,包括编辑器备份、补丁文件、外部模块生成的文件等,使源码树与原始发布包基本一致。

日常开发中常用 make clean 重新编译;需要全新配置时用 make mrproper;需要打包源码时用 make distclean。

配置

make menuconfig:基于文本菜单的交互式配置界面,是最常用和推荐的配置方式。它需要 ncurses 库的支持。

make defconfig:为当前架构生成默认配置。如果之前没有 .config 文件,这是一个快速开始的捷径。

make oldconfig:基于现有的 .config 文件进行更新。它会保留所有旧配置,并以交互方式询问用户关于新内核版本中引入的配置选项。

构建

make  make all:这是默认目标。它会编译出内核镜像(vmlinux)和所有被配置为模块()的内核模块。

make vmlinux:只编译内核镜像本身,不编译模块。

make modules:只编译内核模块。当你修改了某个驱动代码,只想快速验证时,这个命令非常有用。

make modules_install:将编译好的内核模块安装到系统目录中(通常是 /lib/modules/<内核版本>/)。这个操作通常需要 root 权限。

make install:将编译好的内核镜像(如 arch/x86/boot/bzImage)安装到 /boot 目录,并可能更新引导加载程序(如 GRUB)的配置文件。这个操作通常也需要 root 权限。

内核make常用变量

make V=1:进行详细输出,在编译时打印出实际执行的每一个完整命令。对于调试编译问题非常有帮助。

make -jN:并行编译。-j 后面的数字 N 指定同时进行的编译任务数,通常可以设为 CPU 核心数的两倍左右,能极大加快编译速度。例如 make -j8。

make O=/path/to/build/dir:将编译生成的所有文件输出到指定目录,而不是混在源码目录中。这样可以保持源码目录的清洁,并且方便为不同配置维护多个编译版本。

make C=1make C=2:在编译时使用 Sparse 工具进行代码静态检查。C=1 只检查重新编译的文件,C=2 检查所有文件。

make M=path/to/external/module:编译外部内核模块。这让你可以在内核源码树之外开发、编译自己的内核模块。

Makefile中的几个赋值方法的区别

=

递归扩展赋值,定义一个递归扩展变量。变量的值在每次被展开(即被使用时)才进行替换,并且如果值中引用了其他变量,这些引用会递归地展开。

?=

条件赋值,仅当该变量之前没有被定义(即尚未赋值)时,才执行赋值操作;如果变量已经存在(即使值为空),?= 不会改变它。提供默认值,避免覆盖用户通过环境变量或命令行传入的值。

+=

追加赋值,将右侧的文本追加到变量原有值的后面,并在两者之间自动插入一个空格(如果原变量非空)。

:=

简单扩展赋值,定义一个简单扩展变量。变量的值在定义时立即展开(即右值中的变量引用在赋值那一刻就被替换成当时的值),此后该变量的值就是那个固定的字符串。

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Linux内核源码构建简介

评论 抢沙发

6 + 3 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮