安装Kernel 源码这步通常不是必需的,除非你想自己编译内核或者做一些特殊的开发
工作。一些情况下,我们需要KernelHeaders。
安装内核源码一般需要以下四个基本步骤:
下载所需内核源码; 安装SRPM; 利用rpmbuild 命令将源码转变成为可用状态
(usablestate);编译安装。
1、下载内核源码
可以从这里获取源码: http://archives.fedoraproject.org/pub/archive/fedora/linux/releases/8/Fedora/source/SRPMS/
选择一个适合当前版本的内核,
例如: kernel-2.6.23.1-42.fc8.src.rpm31-Oct-200700:0646M
2、安装源码
即,安装上面一步得到的src.rpm:
$ sudo rpm -ivh kernel-2.6.23.1-42.fc8.src.rpm
1:ker nel###########################################[100% ]
其中可能有一些警告提示之类,大多可以不必理会。
3、转换源码:
在转换之前,请确保/usr/src/目录下有redhat目录(一般/usr/src/是空目录)。
$ sudo rpmbuild -bp --target=$(uname -m) /usr/src/redhat/SPECS/kernel.spec
这样会将源码放置在/usr/src/redhat/BUILD/kernel-2.6.23/。
这里有两个有用的文件夹:.
A、linux-2.6.23.ARCH──这个是kernel.org 提供的包经过Fedora 补丁和升级得到的。
ARCH 与uname-m 的输出结果一致,通常为i686。如果你想得到不同的输出,你可以使用
“--target=”这个选项来进行指定。
B、vanilla──这个是标准的、由kernel.org 提供的没有经过补丁和升级的源码。
贴出路径:
$ ll
总计 32
drwxr-xr-x 3 root root 4096 10-13 21:07 BUILD
drwxr-xr-x 2 root root 12288 10-13 21:04 SOURCES
drwxr-xr-x 2 root root 4096 10-13 21:04 SPECS
4、编译源码:
$ cd /usr/src/redhat/BUILD/kernel-2.6.23/linux-2.6.23.i686
要修改Makefile文件
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核 Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile 经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的 Makefile。
例如:uname -r 值是2.6.23.1-42.fc8,那么就设置EXTRAVERSION = -42.fc8
在修改时,请注意看前面几个字段的取值,和uname -r比较。
EXTRAVERSION 的修改非常重要。笔者曾有修改错误,导致模块编译成功却无法插入的经历。
$ make mrproper
$ make oldconfig
$ make (运行时间非常久,可以看个电影打发时间)
$ make modules_install
$ make install
自此内核编译已经结束了。
调试程序:
hello.c
代码:
#include <linux/module.h>
#if defined(CONFIG_SMP)
#define __SMP__
#endif
#if defined(CONFIG_MODVERSIONS)
#define MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_DEBUG "Hello, kernel!/n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_DEBUG "Good-bye, kernel!/n");
}
代码:
#makefile for 2.6 linux kernel
obj-m := hello.o
KDIR :=/lib/modules/`uname -a`/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
$ make
$ ismod hello.ko
$ dmesg | tail n1
说明:1,2.4内核的Makefile和2.6内核的Makefile写法不同。
2,Makefile不可写成makefile会编译不通过。
3,/lib/modules/`uname -a`/build文件是一个链接,链接到你的/usr/src/....内核数的一个目录。
有些文章说还要以下的工具才能起作用:
安装Kernel Headers(头文件)
这个包提供Kernel Headers和makefiles足以应付kernel包中的模块编译。如果你需要安装驱动和某些第三方软件,你应该很需要Kernel Headers。如果一个驱动要求内核源码,那么也许安装Kernel Headers就已经足够了。
Kernel Headers通过安装kernel-devel RPM包就可以得到。这个包可能没有被Fedora自动安装。这个软件包可以从你的Fedora DVD安装或者通过FTP和YUM在线安装。
在Fedora软件仓库和Update软件仓库中在线查找同时确保他们与你的系统相匹配,使用uname命令。示例:
[mirandam@charon ~]$ uname -rm
2.6.23.1-42.fc8 i686
Select: kernel-devel-2.6.23.1-42.fc8.i686.rpm
选择: kernel-devel-2.6.23.1-42.fc8.i686.rpm
如果你已经升级过你的kernel(使用yum),那么建议你使用yum来安装这个软件包。
[mirandam@charon ~]$ sudo yum install kernel-devel
文章出处:http://www.diybl.com/course/6_system/linux/Linuxjs/2008628/128979_5.html