内核补丁不是一定需要的,这要看你选择的是怎样的Linux内核,比如下载下来标准的Linux内核,想要编译linux系统在x86的PC机上运行,就根本不用什么板间支持的补丁了,因为标准Linux内核本身基于x86平台测试。而如果使用Embedix内核,开发板是PPC体系的,内核可能本身已经支持PPC,也不需要安装补丁了。但嵌入式系统往往工作在不同的特定目标板上,如arm,这就需要使linux内核扩展对目标体系的支持了。
常见的如arm板,下载了标准Linux内核是不够的,还要从arm linux的相关站点下载相应版本的补丁,标准内核安装了补丁后才能正确配置,对目标体系支持。如linux-2.4.18.tar.bz2内核,打补丁 patch-2.4.18-rmk7.bz2就跟整合了的源码包linux-2.4.18-rmk7.tar.bz2一样了,是一个armlinux系统内核了。而如果需要扩展对m68k芯片的支持,就需要m68k的补丁了。
补丁的安装方法可以参考man patch的说明,我总结自己常用的方法如下:
1、 patch应用的方法是进入内核目录后#patch -p1 < patch文件的位置,注意<前后都有一个空格,如:
# bunzip2 patch-2.4.18-rmk7.bz2把patch-2.4.18-rmk7.bz2解压成patch-2.4.18-rmk7(覆盖了原压缩文件)
把patch-2.4.18-rmk7移动到内核解压目录linux中。
# mv patch-2.4.18-rmk7 linux/
进入linux目录
# patch -p1 < patch-2.4.18-rmk7
得到
……
patching file net/irda/iriap.c
patching file net/irda/irlan/irlan_common.c
patching file net/irda/irlap_event.c
patching file net/irda/irlap_frame.c
patching file net/irda/irttp.c
patching file net/sched/Config.in
成功应用补丁。
2、把解压的补丁(不用解压)移动到解压的内核目录中,执行# bzip2 -dc patch-2.4.18-rmk5.bz2 | patch -p1
其中patch -p1 ../patch-2.6.26.8补丁命令的"-p"参数说明如下:
"-p 0":表示使用完整路径名。
"-p 1":表示去除路径前面的斜杠。
"-p 4":表示去除路径前面的斜杠和前面的三个目录。
##############################################################################################
8.4.5 内核补丁编译步骤
Linux内核工作一段时间后,某些模块出现新的版本或者需要支持更高级的功能时,便需要给内核打上相应的补丁。
以下示例演示了为linux-2.6.26内核打补丁的过程,补丁打完后内核的版本为linux-2.6.26.8,具体步骤如下所示:
(1) 检查当前内核源码的版本号。
- [root@rhel5 ~]# cd /usr/src/
- [root@rhel5 src]# ls -F
- kernels/ linux-2.6.26 redhat/
- [root@rhel5 src]#cd linux-2.6.26
//进入linux-2.6.26内核目录 - [root@rhel5 linux-2.6.26]# make kernelversion
//查看内核版本号 - 2.6.26
- [root@rhel5 linux-2.6.26]# head -5 Makefile
//查看Makefile文件,了解内 - 核版本号
- VERSION = 2
- PATCHLEVEL = 6
- SUBLEVEL = 26
- EXTRAVERSION =
- NAME = Rotary Wombat
(2) 若用户没有安装linux-2.6.26内核,则可以采用以下步骤对其下载并解压。如果已经安装了linux-2.6.26内核版本,可跳过此步骤。
- [root@rhel5 ~]# wget -c
- http://www.kernel.org/pub/linux/kernel/v2.6/linux
-2.6.26.tar.bz2 . //到官网下载内核 - --18:59:19--
- http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2
- Resolving www.kernel.org... 199.6.1.164, 204.152.191.37, 130.239.17.4, ...
- Connecting to www.kernel.org|199.6.1.164|:80... connected.
- HTTP request sent, awaiting response... 200 OK
- Length: 49441874 (47M) [application/x-bzip2]
- --18:59:20-- (try: 2)
- http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2
- Reusing existing connection to www.kernel.org:80.
- HTTP request sent, awaiting response... 200 OK
- Length: 49441874 (47M) [application/x-bzip2]
- Saving to: 'linux-2.6.26.tar.bz2'
- 100%[=======================================>]
49,441,874 126K/s in 4m 28s - 19:03:49 (180 KB/s) - `linux-2.6.26.tar.bz2' saved
[49441874/49441874] - --19:03:49-- http://./
- Resolving .... failed: Name or service not known.
- FINISHED --19:03:49--
- Downloaded: 1 files, 47M in 4m 28s (180 KB/s)
- [root@rhel5 ~]# tar -jxf linux-2.6.26.tar.bz2 -C /usr/src/
-
//解包解压缩内核
(3) 下载补丁,将linux-2.6.26内核升级到linux-2.6.26.8版本。
- [root@rhel5 src]# wget -c
- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.8.gz .
-
//到官网下载补丁。 - --18:53:09--
- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.8.gz
- Resolving www.kernel.org... 199.6.1.164, 204.152.
191.37, 130.239.17.4, ... - Connecting to www.kernel.org|199.6.1.164|:80... connected.
- HTTP request sent, awaiting response... 200 OK
- Length: 134442 (131K) [application/x-gzip]
- --18:53:14-- (try: 2)
- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.8.gz
- Reusing existing connection to www.kernel.org:80.
- HTTP request sent, awaiting response... 200 OK
- Length: 134442 (131K) [application/x-gzip]
- Saving to: `patch-2.6.26.8.gz'
- 100%[=======================================>]
134,442 43.7K/s in 3.0s - 18:53:17 (43.7 KB/s) - 'patch-2.6.26.8.gz' saved [134442/134442]
- --18:53:17-- http://./
- Resolving .... failed: Name or service not known.
- FINISHED --18:53:17--
- Downloaded: 1 files, 131K in 3.0s (43.7 KB/s)
(4) 解压缩补丁。
- [root@rhel5 src]# ls -F
- kernels/ linux-2.6.26/ patch-2.6.26.8.gz redhat/
- [root@rhel5 src]# gzip -dv patch-2.6.26.8.gz
- patch-2.6.26.8.gz: 71.8% -- replaced with patch-2.6.26.8
- [root@rhel5 src]# ls -F
- kernels/ linux-2.6.26/ patch-2.6.26.8 redhat/
(5) 安装补丁。
- [root@rhel5 src]# cd linux-2.6.26/ //进入linux-2.6.26内核源码目录
- [root@rhel5 linux-2.6.26]# ls //显示linux-2.6.26内核源码目录内容
- COPYING MAINTAINERS arch fs kernel samples usr
- CREDITS Makefile block include lib scripts virt
- Documentation README crypto init mm security
- Kbuild REPORTING-BUGS drivers ipc net sound
- [root@rhel5 linux-2.6.26]# patch -p1 <../patch-2.6.26.8 //安装2.6.26.8内
- 核补丁
- ......中间已省略。
- patching file sound/core/pcm.c
- patching file sound/core/pcm_native.c
- patching file sound/core/rawmidi.c
- patching file sound/core/seq/oss/seq_oss_synth.c
- patching file sound/pci/emu10k1/emu10k1_main.c
- patching file sound/pci/emu10k1/emumixer.c
- patching file sound/pci/hda/hda_intel.c
- patching file sound/pci/hda/patch_analog.c
- patching file sound/pci/hda/patch_sigmatel.c
- patching file sound/pci/oxygen/hifier.c
- patching file sound/pci/oxygen/oxygen.c
- patching file sound/pci/oxygen/oxygen_mixer.c
- patching file sound/pci/trident/trident_main.c
- patching file sound/ppc/awacs.c
- patching file sound/soc/fsl/fsl_dma.c
- patching file sound/soc/fsl/fsl_ssi.c
- patching file virt/kvm/kvm_main.c
其中patch -p1 ../patch-2.6.26.8补丁命令的"-p"参数说明如下:
"-p 0":表示使用完整路径名。
"-p 1":表示去除路径前面的斜杠。
"-p 4":表示去除路径前面的斜杠和前面的三个目录。
(5) 查看当前内核源码的版本。
- [root@rhel5 linux-2.6.26]# head -5 Makefile
- VERSION = 2
- PATCHLEVEL = 6
- SUBLEVEL = 26
- EXTRAVERSION = .8
- NAME = Rotary Wombat
- [root@rhel5 linux-2.6.26]# make kernelversion
- 2.6.26.8
至此,内核补丁已打好,接下来就是使用make menuconfig之类的命令来配置内核、编译内核、编译模块、安装模块和安装内核。
1.为单个文件生成补丁
+ + + linux - 2. 6. 28. 8 /net /sunrpc /svc.c 2009 - 03 - 30 19 : 18 : 41. 859375000 + 0800
@@ - 1050, 11 + 1050, 11 @@ svc_process( struct svc_rqst *rqstp)
2.为多个文件生成补丁
3.打补丁
4. 示例
$ cd linux - 2. 6. 31. 3
$ patch -p1 < mypatch