下面的实验以 debian7.5 64bit 为例.
获取源码获取 debian7.5 本身的源码非常简单:
sudo apt-get install linux-source
https://www.kernel.org/ 的git上提供的源码分支非常多, 刚开始学习源码主要关注下面几个分支:
上面的列出的git树中都可以获取想要的源码.
编译内核其实编译内核和编译普通软件也没多大区别, 只是内核编译的参数非常之多.下面就来先看看如何设置内核编译参数
内核编译选项配置编译选项: 设置内核编译选项是通过 kconfig 这个工具来完成的. kconfig 的源码就是内核代码中 script/kconfig 目录下
各个编译选项的选择有3种方式:
编译方法:
编译很简单, 内核编译选项设置好之后, 只需简单的命令 make, 就可以编译了.由于内核代码的庞大, 所以和一般应用程序相比, 编译时间会很长. 可以尝试以下方法来加快编译速度:
使用 make localmodconfig 来生成仅以正在使用的内核模块为对象的 .config (一般这样生成的.config中包含的内核模块最少, 所以编译速度快)
编译时间比较: 测试环境 - debian v7.5虚拟机(cpu: 单核, 内存: 512MB)
.config生成 | make时间 | 生成的modules | 备注 |
---|---|---|---|
make menuconfig | 1小时13分41秒 | 3052个.ko, 共1.2GB | 默认配置, 什么也不选择 |
make localmodconfig | 19分36秒 | 337 个.ko, 共176MB |
注 modules 是通过 make modules_install 之后, 在 /lib/modules 中根据编译内核版本号来查看的查看有多少个 .ko 文件的方法:
cd /lib/modules/3.2.60find . -name '*.ko' | wc -l
分开编译模块和内核不在一起的编译, 就是在现有的内核中追加一些内核模块时, 不需要将内核也重新编译.模块分开编译的方法很简单, 参考之前的博客: 《Linux内核设计与实现》读书笔记(六)- 内核数据结构 这篇博客中的例子就是和内核分开编译的模块.
交叉编译交叉编译就是在当前平台上编译其他平台上的内核二进制映像, 比如在 x86_64 平台上编译 arm 的内核映像.交叉编译需要目标平台的交叉编译器. 编译时主要是 ARCH 和 CROSS_COMPILE 2个变量的设置.
下面举个交叉编译 ARM 的例子: 公司用的制作 Cubieboard 板子上的image中的一段编译内核的代码
make -C ${CB_KSRC_DIR} O=${CB_KBUILD_DIR} ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- kernel_defconfigmake -C ${CB_KSRC_DIR} O=${CB_KBUILD_DIR} ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 INSTALL_MOD_PATH=${CB_TARGET_DIR} uImage modules
上述 第一行 是编译内核源码. 第二行 是创建 uImage 格式的内核映像以及创建内核模块最终在 INSTALL_MOD_PATH 生成的内核模块可以直接拷贝到 arm机器上使用.
生成内核包debian 系 linux下生成 内核源码包的方法
make deb-pkg
安装内核make modules_install (安装内核模块到 /lib/modules 下)make install (安装内核二进制映像, 生成并安装boot初始化文件系统映像文件)
卸载内核新闻热点
疑难解答