首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 内核编译介绍

Linux内核版本

Linux内核有两种:稳定的和处于开发中的。稳定的内核具有工业级的强度,可以广泛地应用和部署。新推出的稳定内核大部分都只是修正了一些 Bug 或是加人了一些新的设备驱动序另一方面处于开发中的内核中许多东西变化得都很快。而且由于开发者不断试验新的解决方案,内核常常发生剧烈的变化。

Linux通过一个简单的命名机制来区分稳定的和处于开发中的内核。这种机制使用三个或者四个用“.”分隔的数字来代表不同内核版本。第一个数字是主版本号,第二个数字是从版本号,第三个数字是修订版本号,第四个可选的数字为稳定版本号 (stable version)。从副版本号可以反映出该内核是一个稳定版本还是一个处于开发中的版本:该数字如果是偶数,那么此内核就是稳定版;如果是奇数,那么它就是开发版。举例来说,版本号为 2.6.30.1 的内核,它就是一个稳定版。这个内核的主版本号是 2,从版本号是6,修订版本号是 30,稳定版本号是 1头两个数字在一起描述了“内核系列”一一在这个例子中,就是 2.6 版内核系列。

获取内核源码

从Linux社区获取内核kernel源码

Linux社区的官方网站是 https://kernel.org/ ,页面如下:

从github仓库获取内核kernel源码

Linux内核源码在github上的网址为:https://github.com/torvalds/linux ,页面如下:

从github仓库下载内核主线的代码命令如下:

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

当然,网上还有其他很多源码下载方法,这儿就不再做介绍。

Linux内核源码树

内核源码树由很多目录组成,而大多数目录又包含更多的子目录。源码树的根目录及其子目录如下所示。

编译内核配置内核

因为 Linux 源码随手可得,那就意味着在编译它之前可以配置和定制。的确,你可以把自己需要的特定功能和驱动程序编译进内核。在编译内核之前,首先你必须配置它。由于内核提供了数不胜数的功能,支持了难以计数的硬件,因而有许多东西需要配置。可以配置的各种选项,以CONFIG FEATURE 形式表示,其前为 CONFIG。例如,对称多处理器(SMP)的配置选项为CONFIG SMP。如果设置了该选项,则SMP 启用,否则,SMP 不起作用。配置选项既可以用来决定哪些文件编译进内核,也可以通过预处理命令处理代码。

这些配置项要么是二选一,要么是三选一。二选一就是yes 或no。比如CONFIGPREEMPT就是二选一,表示内核抢占功能是否开启。三选一可以是 yes、no 或module。modul意味着该配置项被选定了,但编译的时候这部分功能的实现代码是以模块(一种可以动态安装的独立代码段)的形式生成。在三选一的情况下,显然 es 选项表示把代码编译进主内核映像中而不是作为一个模块。驱动程序一般都用三选一的配置项。

内核提供了各种不同的工具来简化内核配置。最简单的一种是一个字符界面下的命令行工具:

make config

如下图所示

该工具会逐一遍历所有配置项,要求用户选择 yesno或是 module(如果是三选一的话)由于这个过程往往要耗费掉很长时间。

基Fncurse库编制的图形界面工具:

make menuconfig

图形化界面如下图所示,可以根据提示进行相关操作。

这些配置项会被存放在内核代码树根目录下的.config文件中。你很容易就能找到它(内核开发者差不多都能找到),并且可以直接修改它。在这里面查找和修改内核选项也很容易。在你修改过配置文件之后,或者在用已有的配置文件配置新的代码树的时候,你应该验证和更新配置:

make oldconfig

事实上,在编译内核之前你都应该这么做。

配置选项CONFIG IKCONFIG PROC把完整的压缩过的内核配置文件存放在/proc/confg.gz 下,这样当你编译一个新内核的时候就可以方便地克隆当前的配置。如果你目前的内核已经启用了此选项,就可以从 /proc 下复制出配置文件并且使用它来编译一个新内核:

zcat /proc/config.gz > .config

make oldconfig

一旦内核配置好了就可以使用一个编译它了。

编译内核

make 程序能把编译过程拆分成多个并行的作业。其中的每个作业独立并发地运行,这有助于极大地加快多处理器系统上的编译过程,也有利于改善处理器的利用率,因为编译大型源代码树也包括 I/0等待所花费的时间

默认情况下,make 只衍生一个作业,因为 Makefles 常会出现不正确的依赖信息。对于不正确的依赖,多个作业可能会互相踩踏,导致编译过程出错。当然,内核的 Makeles 没有这样的编码错误,因此衍生出的多个作业编译不会出现失败。为了以多个作业编译内核,使用以下命令 :

make -jn

安装新内核

安装编译好的内核模块:

make modules_install

安装完毕后可以到/lib/modules目录下查看到新安装的内核。

安装内核:

执行make install命令调用内核目录中的install.sh的shell脚本完成安装任务。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O2UjmvtDxC10raJ4WgQQJi8A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券