建议直接去官方网站( www.kernel.org )下载Linux内核代码。
编译内核时,一般将源码解压到/usr/src目录下,解压完成后会在该目录下生成一个与源码包版本号一致的目录。
1 | mv linux-3.12.6.tar.xz /usr/src //将下载的内核移动到/usr/src/目录下 |
linux源根目录/Documentation/00-INDEX:目录索引
linux源根目录/Documentation/HOWTO:指南
生成linux内核帮助文档:在linux源根目录(Documentation) 执行下面的命令
1 | make htmldocs |
在 https://www.kernel.org/doc/html/latest/index.html 也能查看到官方生成的文档
说明一下:本文章是根据Ubuntu系统的命令格式来写的
更换内核之前,先更新一下源:
1 | sudo apt-get update |
然后安装一些必要的编译内核的工具
1 | apt-get install libncurses5-dev build-essential kernel-package |
进入下载的内核主目录:
1 | cd linux-3.12.6 |
清理所有产生的文件与config配置文件(第一次编译内核时可省略)
1 | sudo make mrproper |
在编译内核时,需要配置内核,可以使用下面命令中的一个:
1 | make config #(基于文本的最为传统的配置界面,不推荐使用) |
make menuconfig
最值得推荐,它不依赖于QT或GTK+,且非常直观,对/home/baohua/develop/linux中的Linux 4.0-rc1内核运行 make ARCH=arm menuconfig
后的界面如下图所示。
对每一个配置选项,用户有三种选含义如下:
<*>或[*]
——编译进内核本体Linux内核的配置系统由以下3个部分组成。
Makefile
:分布在Linux内核源代码中,定义Linux内核的编译规则。Kconfig
(配置文件):给用户提供配置选择的功能。配置工具
:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供字符界面和图形界面)。这些配置工具使用的都是脚本语言,如用Tcl/TK、Perl等。.config配置文件
(隐藏文件):
运行make menuconfig等时,配置工具首先分析与体系结构对应的/arch/xxx/Kconfig文件(xxx即为传入的ARCH参数)
编译
1 | sudo make -j4 # 以4个内核多线程方式编译内核 |
安装
1 | sudo make modules_install |
此时,内核编译完成。安装完成后会在/boot目录下生成几个新内核的文件。
剩下是修改启动程序配置,然后运行新的内核程序。
进入引导程序(boot loader)的配置文件看看,对于不同的引导程序(LILO和GRUB),其配置文件所在路径不同。
本系统为GRUB引导,因此进入/boot/grub/grub.cfg
查看grub.conf配置文件,会发现新内核的信息已经写入了
如果想开机默认显示grub菜单栏:编辑grub.conf,然后注释掉”GRUB_HIDDEN_TIMEOUT”和”GRUB_HIDDEN_TIMEOUT_QUIET”
1 | sudo vi /etc/default/grub |
编辑完毕之后更新一下:
1 | sudo update-grub |
重启,然后选择更改后的内核
1 | sudo reboot |
在Linux内核中增加程序需要完成以下3项工作:
这里主要对内核源代码各级子目录中的kbuild(内核的编译系统)Makefile进行简单介绍,这部分是内核模块或设备驱动开发者最常接触到的。
Makefile的语法包括如下几个方面。
目标定义
:用来定义哪些内容要作为模块编译,哪些要编译并链接进内核。(编译成模块or编译进内核)1 | obj -y += foo.o |
make menuconfig
后生成的config文件
的CONFIG_变量
来决定文件的编译方式,如:1 | obj -$(CONfiG_ISDN) += isdn.o |
obj -
形式的目标以外,还有lib -y library库
、hostprogs -y主机程序
等目标,但是这两类基本都应用在特定的目录和场合下。多文件模块的定义
:处理一个模块由多个文件组成的情况。1 | # |
目录层次的迭代
:处理是否编译一个目录中文件进内核的情况。1 | obj -$(CONfiG_EXT2_FS) += ext2/ |
Kconfig(配置文件):在内核编译时给用户提供配置选择的功能。
主要包括如下几个方面。
配置选项
大多数内核配置选项都对应Kconfig中的一个配置选项(config):
1 | config MODVERSIONS # 配置选项 |
“config”关键字定义新的配置选项,之后的几行代码定义了该配置选项的属性。
配置选项的属性
包括:
类型
、数据范围
、输入提示
、依赖关系
、选择关系
及帮助信息
、默认值
等。每个配置选项都必须指定类型
,配置选项类型
包括bool
、tristate
、string
、hex
和int
tristate
和string
是两种基本类型
,其他类型都基于这两种基本类型。类型定义后可以紧跟输入提示
,
1 | bool "Networking support" |
1 | bool |
1 | prompt <prompt> [if <expr>] #可选的if用来表示该提示的依赖关系。 |
1 | default <expr> [if <expr>] |
依赖关系的格式
为:
1 | depends on(或者requires) <expr> |
1 | bool "foo" if BAR |
1 | depends on BAR |
选择关系(也称为反向依赖关系)
:A如果选择了B,则在A被选中的情况下,B自动被选中。(我个人理解为一种包含关系)格式为:
1 | select <symbol> [if <expr>] |
数据范围的格式
为:
1 | range <symbol> <symbol> [if <expr>] |
int和hex类型的选项设置可以接受的输入值范围,用户只能输入大于等于第一个symbol,且小于等于第二个symbol的值。
帮助信息的格式
为:
1 | help(或---help---) |
菜单结构
1 | menu "Network device support" |
1 | config MODULES |
1 | choice |
1 | choice |
用Kconfig配置脚本和Makefile脚本编写的更详细信息,可以分别参见内核文档Documentation目录内的kbuild子目录下的Kconfig-language.txt和Makefiles.txt文件。
内核多次编译过,在编译开始之前可进行清理
1 | make clean #清理编译的文件,但保留配置文件 |
如果想快速编译,可进行如下操作
1 | make -j * #*为cup核心数 |
如何只编译内核的部分代码
只编译某子目录中的相关代码:
1 | cd /usr/src/linux |
只编译部分模块:
1 | make M=path/to/dir |
只编译一个模块:
1 | make path/to/dir/MOD_NAME.ko |
make O=/path/to/somewhere
```
《Linux设备驱动开发详解:基于最新的Linux4.0内核》
linux内核编译详解
Linux 内核编译
Linux源码下生成并安装内核文档
Linux(ubuntu)更换内核方法
linux内核编程入门 hello world
Makefile教程(绝对经典,所有问题看这一篇足够了)
如何系统地学习 Makefile 相关的知识(读/写)?
Makefile-百度百科
Update your browser to view this website correctly. Update my browser now