当前位置:首页 » 编程软件 » 什么是内核编译

什么是内核编译

发布时间: 2022-02-27 10:20:07

linux为什么要编译内核

Linux内核版本是不断更新的,通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等。而已安装好的Linux系统如果不是滚动升级的,或者没有内核更新选择的话,如果用户想要使用这些新特性,或想根据自己的硬件平台定制一个更高效,更稳定,更快速的内核,就需要重新编译内核。

下载源码编译内核,如果不做相关优化,直接编译,结果就跟现在正在使用的系统没什么区别。

学习linux驱动,必须要有实践的平台环境吧,至于需不需要购置平台,要看你的学习目的了。

Ⅱ 如何编译一个内核

1. 预备工作
我推荐使用root用户执行下面所有的步骤. 如果你还没有创建root登陆口令, 请运行下面的命令:
sudo passwd root
然后, 以root身份登陆:
su
如果你想使用一般用户来替代root用户, 记住在本文所有命令前输入sudo, 比如当我运行
apt-get update
你需要运行下面的命令来替代, 等.
sudo apt-get update
1.1 Ubuntu 6.10上的/bin/sh ("Edgy Eft")
在Ubuntu 6.10, /bin/sh缺省是一个链接到/bin/dash的字符链接. 当你编译软件源代码的时候, /bin/dash似乎还存在问题. 至少我已经遇到了一些问题. 所以我把/bin/sh链接到了/bin/bash.
如果你使用Ubuntu 6.10, 现在你可以运行:
rm -f /bin/sh
ln -s /bin/bash /bin/sh
2 安装必需的软件包 (为内核编译做准备)
首先我们升级软件(包)库:
apt-get update
然后我们安装所有需要的软件包:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
3 下载内核源代码
接下来我们下载需要的内核到/usr/src目录(去
www.kernel.org
网站下载你需要的内核版本, 比如. linux-2.6.18.1tar.bz2(你可以从这里下载所有的2.6内核: http://www.kernel.org/pub/linux/kernel/v2.6/). 然后下载到/usr/src目录:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2
然后解压内核源代码, 创建一个指向内核源代码目录的linux字符链接:
tar xjf linux-2.6.18.1.tar.bz2
ln -s linux-2.6.18.1 linux
cd /usr/src/linux
4 给内核源代码打补丁(可选)
有时你的缺省内核不支持新买的设备, 你需要安装新的驱动. 或者你需要使用虚拟技术或其它高级的技术, 而这些现有的内核都不支持. 这样情况下你需要给给内核源代码打补丁(当然补丁已经发布..)
现在我们假设你已经下载需要的补丁(以下例子我叫它patch.bz2)到/usr/src. 运行下面的命令给内核源代码直接打上补丁(你的用户必须位于/usr/src/linux目录):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
第一个命令用于测试, 对内核没有任何影响. 如果没有显示错误, 你可以运行第二个命令给内核打补丁. 如果第一个命令有误, 请务继续的操作!
你也能够通过内核的prepatches方式打补丁. 比如, 如果你需要一个功能, 而这个功能仅存在于2.6.19-rc4中,
正式完整的内核版本仍没有发布, 而patch-2.6.19-rc4.biz2已经发布. 你可以把这个补丁打到2.6.18的内核源代码中,
但请不要达到2.6.18.1或2.6.18.2, 等. 这个规则在接下来的网页中注明:
http://kernel.org/patchtypes/pre.html
prepatches等同于linux中的测试发行; 他们位于存档的测试目录中,
我们可以使用patch(1)工具对上一个完整发行版(版本号分三部分)打补丁(例如, 2.6.12-rc4
prepatch只可以给2.6.11内核源代码打补丁, 而不是2.6.11.10.)
所以如果你想编译2.6.19-rc4内核, 你必须在步骤3.1下载2.6.18(
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2
)替代2.6.18.1内核源代码!
下面是如何给2.6.18打上2.6.19-rc4补丁:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1
5. 配置内核
使用当前工作内核的配置文件做为新内核配置文件的基础是一个很好的主意. 因此我们拷贝已存的配置文件到/usr/src/linux:
cp /boot/config-`uname -r` ./.config
然后运行
make menuconfig
然后我们看到内核的配置菜单. 移动绿色光标到 Load an Alternate Configuration File 行后选择.config文件(包含了当前工作内核的配置)做为配置文件:

然后浏览内核配置菜单, 选择你需要的功能. 完成配置后, 选择Exit, 回答下面的问题(Do you wish to save your new kernel configuration? 你希望保存新的内核配置吗?), 选择Yes:
6 构建内核
执行下面命令来构建内核:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image
kernel_headers
在--append-to-version= 后面你可以写上任何字符串来区别内核版本, 但是必须以" - "符号开始而且后面不包括任何空格.
保持耐心, 内核编译需要一定时间, 主要看你的内核配置和处理器速度.
7 安装新内核
在成功构建内核后, 你在/usr/src目录能发现两个.deb软件包.
cd /usr/src
ls -l
在我的测试系统上, 他们分别名为
linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(包含了实际的内核) 和
linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(包含了需要的文件, 用于以后需要编译额外的内核模块). 我是这样安装的:
dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(现在你甚至能够拷贝这两个.deb文件到其它的Ubuntu系统, 通过上面的方式安装. 你将不再需要编译内核.)
然后检查 /boot/grub/menu.lst文件, 现在你将能发现新内核使用的两个引导配置块:
vi /boot/grub/menu.lst
在我测试系统上已经添加好的引导配置块是这样的:
title Ubuntu, kernel 2.6.18.1-custom
root (hd0,0)
kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash
initrd /boot/initrd.img-2.6.18.1-custom
savedefault
boot
title Ubuntu, kernel 2.6.18.1-custom (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro single
initrd /boot/initrd.img-2.6.18.1-custom
boot
现在重启系统:
shutdown -r now
如果一切进展顺利, 你的新内核正常工作. 你还可以通过运行下面命令来检查新内核是否运行:
uname -r
这将会显示如:
2.6.18.1-custom
如果系统没有起来, 重启一下, 你会看到:

按ESC进入GRUB菜单:

选择你以前的内核启动系统, 现在你能再次尝试编译新的工作内核. 不要忘记从/boot/grub/menu.1st文件中移去不需要的引导内核信息.

Ⅲ Linux 内核编译有哪几种

所有的软件现在基本都是用高级语言编写的,Linux 内核也不例外。Linux 内核是用 C 语言写的。 但高级语言编写的程序有个问题就是,源代码是不能直接运行的。要么用解释语言解释运行(功能限制很大,应用环境限制也很大)

Ⅳ linux编译内核步骤

一、准备工作
a) 首先,你要有一台PC(这不废话么^_^),装好了Linux。
b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)、make、ncurses等工具。
c) 下载一份纯净的Linux内核源码包,并解压好。

注意,如果你是为当前PC机编译内核,最好使用相应的Linux发行版的源码包。

不过这应该也不是必须的,因为我在我的Fedora 13上(其自带的内核版本是2.6.33.3),就下载了一个标准的内核linux-2.6.32.65.tar.xz,并且顺利的编译安装成功了,上电重启都OK的。不过,我使用的.config配置文件,是Fedora 13自带内核的配置文件,即/lib/moles/`uname -r`/build/.config

d) 如果你是移植Linux到嵌入式系统,则还要再下载安装交叉编译工具链。

例如,你的目标单板CPU可能是arm或mips等cpu,则安装相应的交叉编译工具链。安装后,需要将工具链路径添加到PATH环境变量中。例如,你安装的是arm工具链,那么你在shell中执行类似如下的命令,假如有类似的输出,就说明安装好了。
[root@localhost linux-2.6.33.i686]# arm-linux-gcc --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
注:arm的工具链,可以从这里下载:回复“ARM”即可查看。

二、设置编译目标

在配置或编译内核之前,首先要确定目标CPU架构,以及编译时采用什么工具链。这是最最基础的信息,首先要确定的。
如果你是为当前使用的PC机编译内核,则无须设置。
否则的话,就要明确设置。
这里以arm为例,来说明。
有两种设置方法():

a) 修改Makefile
打开内核源码根目录下的Makefile,修改如下两个Makefile变量并保存。
ARCH := arm
CROSS_COMPILE := arm-linux-

注意,这里cross_compile的设置,是假定所用的交叉工具链的gcc程序名称为arm-linux-gcc。如果实际使用的gcc名称是some-thing-else-gcc,则这里照葫芦画瓢填some-thing-else-即可。总之,要省去名称中最后的gcc那3个字母。

b) 每次执行make命令时,都通过命令行参数传入这些信息。
这其实是通过make工具的命令行参数指定变量的值。
例如
配置内核时时,使用
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
编译内核时使用
make ARCH=arm CROSS_COMPILE=arm-linux-

注意,实际上,对于编译PC机内核的情况,虽然用户没有明确设置,但并不是这两项没有配置。因为如果用户没有设置这两项,内核源码顶层Makefile(位于源码根目录下)会通过如下方式生成这两个变量的值。
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
ARCH?= $(SUBARCH)
CROSS_COMPILE ?=

经过上面的代码,ARCH变成了PC编译机的arch,即SUBARCH。因此,如果PC机上uname -m输出的是ix86,则ARCH的值就成了i386。

而CROSS_COMPILE的值,如果没配置,则为空字符串。这样一来所使用的工具链程序的名称,就不再有类似arm-linux-这样的前缀,就相当于使用了PC机上的gcc。

最后再多说两句,ARCH的值还需要再进一步做泛化。因为内核源码的arch目录下,不存在i386这个目录,也没有sparc64这样的目录。

因此顶层makefile中又构造了一个SRCARCH变量,通过如下代码,生成他的值。这样一来,SRCARCH变量,才最终匹配到内核源码arch目录中的某一个架构名。

SRCARCH := $(ARCH)

ifeq ($(ARCH),i386)
SRCARCH := x86
endif

ifeq ($(ARCH),x86_64)
SRCARCH := x86
endif

ifeq ($(ARCH),sparc64)
SRCARCH := sparc
endif

ifeq ($(ARCH),sh64)
SRCARCH := sh
endif

三、配置内核

内核的功能那么多,我们需要哪些部分,每个部分编译成什么形式(编进内核还是编成模块),每个部分的工作参数如何,这些都是可以配置的。因此,在开始编译之前,我们需要构建出一份配置清单,放到内核源码根目录下,命名为.config文件,然后根据此.config文件,编译出我们需要的内核。

但是,内核的配置项太多了,一个一个配,太麻烦了。而且,不同的CPU架构,所能配置的配置项集合,是不一样的。例如,某种CPU的某个功能特性要不要支持的配置项,就是与CPU架构有关的配置项。所以,内核提供了一种简单的配置方法。

以arm为例,具体做法如下。

a) 根据我们的目标CPU架构,从内核源码arch/arm/configs目录下,找一个与目标系统最接近的配置文件(例如s3c2410_defconfig),拷贝到内核源码根目录下,命名为.config。

注意,如果你是为当前PC机编译内核,最好拷贝如下文件到内核源码根目录下,做为初始配置文件。这个文件,是PC机当前运行的内核编译时使用的配置文件。
/lib/moles/`uname -r`/build/.config
这里顺便多说两句,PC机内核的配置文件,选择的功能真是多。不编不知道,一编才知道。Linux发行方这样做的目的,可能是想让所发行的Linux能够满足用户的各种需求吧。

b) 执行make menuconfig对此配置做一些需要的修改,退出时选择保存,就将新的配置更新到.config文件中了。

Ⅳ 内核编译以及如何得到kernel

注:不仅要对机器本身有了解,还要对Linux系统有一定的了解)有一定的理解——这是一个难题。
因此一个Linux新手是根本不会尝试编译内核的。这篇文章中展示了一些在使用“make xconfig”命令编译内核过程中的截图。
使用这个命令(“make xconfig”),用户可以通过图形用户界面(GUI)和鼠标来对内核进行处理。
这里有差不多40张截图,它们解释了在某种特定的情况下为什么你需要或不能选择某个特定的内核选项(options)。
将这40幅截图逐一讨论看上去似乎有些夸张,但这的确是解释内核的内部工作机理(internal
workings)以及特定内核选项存在的原因和工作原理的比较好的方法。
这些截图是kernel-2.4.6的。最新的内核是2.4.19,但是除去在菜单中有一些新的项目(e.g.对新硬件的支持)以外,
屏幕的显示以及编译的过程应该是一样的。建议你在开始编译前把这篇文章打印出来,这样你就可以随时查找必要的信息!
本文的结构如下。首先讨论你在Internet的什么地方能够找到内核的源码以及如何安装这些源码,
然后通过屏幕截图讨论使用图形界面配置内核。 一旦内核配置完毕,它就需要被编译,但是一个新编译的内核并不能直接使用。
首先,新内核需要和引导程序“lilo”一起安装,然后,在使用lilo前你必须写配置文件“/etc/lilo.conf”。
另外,还有需要指出一些特殊的要点(specific points),比如笔记本电脑需要的PCMCIA支持。
看上去象信用卡的PCMCIA,小型板卡(small inserts)通常负责联网任务,在2.4.x的内核中已经可以直接提供支持。
但之前的内核需要重新编译安装后才能提供PCMCIA支持。SuSE Linux还有一个问题,那就是ALSA声卡驱动程序的音效支持。
这些驱动程序并不是内核的一部分,它们需要被编译进去然后重新安装,因为原始的驱动程序通常没有工作。
更麻烦的是,从一个系列的内核转到另一个系列的内核,比如从2.2.x系列转到2.4.x系列, 可能会由于使用某种(某些)内核工具(kernel
utilities)而产生一些问题。 这就是所谓的“motils”(译者注:可以看为“Moles
Utilities”的所写,这样就不会对这个名称感到费解了),包括代码(code)需要载入(load)的内核模块(kernel
mole):图3解释了什么是内核模块。 有时新内核不知道如何处理老的motils,所以你必须编译和安装更新版本的motils。
这样的问题虽然不多但是它们的确存在,而且目前只能预先指出它们。
但是如果你完全按照本文的步骤进行,几乎不会发生错误。新内核被添加到lilo,或者被复制()到loadlin所在的分区。
因此,在紧急情况下,你仍然可以通过老内核启动机器。然后可以在老内核下试着解决新内核的问题。
即使你遇到motils的问题,你也可以从老内核重新启动计算机,然后通过将它们(内核和motils)分别编译和安装来修复(fix)这个问
题: 所有新版本的motils都对老内核向下兼容,所以新motils在老内核下可以很好的工作。

Ⅵ linux的编译内核和编译内核模块有什么区别

当然需要。。。

第一点,就是源码树中有相应的头文件和函数的实现,没有源码树,你哪调用去呢?(PC上编译的时候内核有导出符号,系统中有头文件,这样就可以引用内核给你的接口了,但是只能编译你PC上版本的内核可加载的模块)。

第二个,内核模块中会记录版本号的部分,需要记录版本号的原因是不同的内核版本之间,那些接口和调用可能会有比较大的差异,因此必须要保证你的代码和某个特定的内核对应,这样编译出来的模块就可以(也是只能)在运行这个内核版本的Linux系统中加载,否则一个很简单的异常就会导致内核崩溃,或者你的代码根本无法编译通过(接口名变了)。

我上面说的是编译模块的情况,当然如果是把模块直接编译到内核当中去的话,那就不用说了,没有内核源码,你无法编译内核。

Ⅶ Linux的内核编译是什么意思

所有的软件现在基本都是用高级语言编写的,Linux 内核也不例外。Linux 内核是用 C 语言写的。
但高级语言编写的程序有个问题就是,源代码是不能直接运行的。要么用解释语言解释运行(功能限制很大,应用环境限制也很大),要么就是通过编译器经解释编译链接后成为计算机可以直接运行的计算机语言,也就是一般成为的二进制程序。

Linux的内核编译就是用编译器把 Linux 的内核源代码编译成可以被计算机运行的二进制代码的行为。

当然 Linux 内核并不完全都是 C 语言写的,还有一部分汇编语言,但汇编语言也需要编译的。

Ⅷ 编译内核和编译内核模块有什么区别(linux)

LINUX 的内核编译
1.编译内核指的时通常的内核
2.应为内核可以将驱动和功能模块动态的载入内核,所以在需要的时间把功能模块
动态载入,所以就有了,内核模块的编译

Ⅸ 谁会linux内核编译

新内核可以在 http://www.kernel.org下载。先把linux-2.6.18.2.tar.bz2 复制到/usr/src/ 的下面tar –jxvf linux-2.6.18.2.tar.bz2cd linux-2.6.18.2 make mrproper 把原来编译产生的垃圾删除 配置内核可以根据需要与爱好使用下面命令中的一个:#make config (基于文本的最为传统的配置界面)#make menuconfig (基于文本选单的配置界面)#make xconfig (基于图形窗口模式的配置界面)#make oldconfig (如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦) 进行配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。例如,如果需要内核支持DOS分区的文件系统,则要在文件系统部分选择FAT或DOS系统支持;系统如果配有网卡、PCMCIA卡等,需要在网络配置中选择相应卡的类型。 选择相应的配置时,有三种选择,它们分别代表的含义如下: “Y”- 将该功能编译进内核 “N”- 不将该功能编译进内核 “M”- 将该功能编译成可以在需要时动态插入到内核中的模块。 将与核心其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响。许多功能都可以这样处理,例如像上面提到的网卡的支持、对FAT等文件系统的支持。 其实现在编译内核最关键的地方就是配置内核。我一般用make menuconfig配置内核。配置2.6.0内核时如果你的主板是Intel芯片的话,你用默认配制也许就可以得到一个满意的内核哦。做法是make menuconfig后离开时选择保存。这里的难点是pci,如果你硬盘是IDE的那一定要选择好你主板上南桥芯片。SCSI的话就是要选择上你的SCSI卡型号。还有就是网卡,声卡芯片的型号了,他们的型号你都可以用lspci 查找到比如我的是。 [root@leo boot]# lspci00:00.0 Host bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)00:01.0 PCI bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)00:07.0 ISA bridge: Intel Corp. 82371AB/EB/MB PIIX4 ISA (rev 08)00:07.1 IDE interface: Intel Corp. 82371AB/EB/MB PIIX4 IDE (rev 01)00:07.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB00:07.3 Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI (rev 08)00:0f.0 VGA compatible controller: VMware Inc [VMware SVGA II] PCI Display Adapter00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)00:11.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)00:12.0 Multimedia audio controller: Ensoniq ES1371 [AudioPCI-97] (rev 02)

Ⅹ 什么情况下需要手动编译 Linux 内核

启动要加载驱动模块,就要先确定有这个模块存在,然后加载它做一些准备。所以要编译内核。。。

内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分。

热点内容
魅族微信多开安卓怎么弄 发布:2025-01-18 10:04:33 浏览:448
网络设置里没有服务器是什么 发布:2025-01-18 09:52:19 浏览:343
阿里云esc服务器系统 发布:2025-01-18 09:49:16 浏览:790
你们家的无线网密码是多少 发布:2025-01-18 09:47:50 浏览:730
renderscriptandroid 发布:2025-01-18 09:32:18 浏览:993
安卓手机如何拍游戏素材 发布:2025-01-18 09:30:59 浏览:348
广州日立压缩机有限公司 发布:2025-01-18 09:15:08 浏览:624
服务器两条宽带如何叠加网速 发布:2025-01-18 08:52:17 浏览:731
oracle存储过程集合 发布:2025-01-18 08:42:39 浏览:885
洋葱数学缓存 发布:2025-01-18 08:38:36 浏览:919