天行健,君子以自强不息;地势坤,君子以厚德载物;
分类: LINUX
2013-08-09 20:51:47
原连接:http://blog.csdn.net/lislee2001/article/details/5997292
准备工作
su -c 'yum install rpmdevtools'
yum-utils也要安装,不过默认已经安装好了,
下面的操作尽量不要用root账户,
rpmdev-setuptree, 建立~ /rpmbuild目录, 在我这里是/home/lislee/rpmbuild建了一些目录,
这些目录是代码树的目录,编译目录等
下载kernel的source,如果嫌这样下载太慢,可以去网上下载现成的包
到内核源代码主页 去下载社区主线版本
或者到下载发行版本
yumdownloader --source kernel
(可以不用 tar -jxvf linux-2.6.32.15.tar.bz2 )
在/home目录里面下好之后有一个rpm包,记下名字,我这里是
kernel-2.6.35.6-48.fc14.src.rpm
安装源码
su -c 'yum-builddep kernel-2.6.35.6-48.fc14.src.rpm'
rpm -Uvh kernel-2.6.35.6-48.fc14.src.rpm
中间忽略warning信息
这个命令将 RPM 内容写到路径
/home/lislee/rmpbuild/SOURSE
和
/home/lislee/rpmbuild/SPECS
准备源码树
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec
配置内核:
Fedora Core 附带的内核配置文件在 configs/ 目录。
例如,i686 SMP 配置文件被命名为
configs/kernel-version-i686-smp.config。
使用下列命令来将需要的配置文件复制到合适的位置,用来编译:
# cd /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686
# cp configs/kernel-version-i686-smp.config .config
(以把系统带有的配置拿过来用,在哪有?在/boot目录下就有一个,那是我们安装的系统带有的.
把它复制过来 并命名为.config。当执行make menuconfig时,首先寻找.config,如果找
到就读取。否则进入arch目录里面寻找相应体系结构默认的配置文件.其实不管有没有都
可以直接make menuconfig,这样最后也还是会生成.config.
cp /boot/config-2.6.35.6-48.fc14.i686 .config
make menuconfig )
您也可以在 /lib/modules/version/build/.config 这个位置找到与您当前的内核匹配的 .config 文件。
注意:
您的内核必须已经启用这些选项进行了编译(用make menuconfig调出内核配置菜单):
Loadable module support --->
[*] Enable loadable module support
[*] Module unloading
[ ] Module versioning support (EXPERIMENTAL)
[*] Automatic kernel module loading
稍微更改一下Makefile:
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile
经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的
Makefile。
例如,如果 uname -r 返回字符串 2.6.35.6-48.fc14.i686 ,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = . 6-48.fc14.i686
也就是最后一个连字符后面的所有内容。
(简单点说就是覆盖原内核了,如果不修改这个可以采用修改grup的方式来达到修改选择内核的目的)
编译内核:
跟普遍的编译方法一样了:
# make bzImage 编译内核
# make modules 编译模块
# make modules_install 安装编译
2.6以后的内核可以用一个make便可生成内核映像和模块了.make直接完成: make bzImage (编译核心) make modules (开始编译模块)
到这里可以分为两个分支,一种是可加载的,一种是直接可以用来启动的,
下面说说可加载的
完成“内核树”的安装:
目录“/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686/”中就是所谓的“内核代码树”
但是“/lib/modules/2.6.15-1.2054_FC5/build”是个符号链接,也指向这个目录,所以这里也可以叫做“内核代码树”
编写内核模块源文件:
// hello.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) {
printk(KERN_ALERT "Hello, world/n");
return 0;
}
static void hello_exit(void) {
printk(KERN_ALERT "Goodbye, cruel world/n");
}
module_init(hello_init);
module_exit(hello_exit);
编写Makefile:
# Makefile
obj-m:=hello.o
KDIR:=/lib/modules/2.6.15-1.2054_FC5/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
执行make命令进行编译就行了, 执行完毕后,会生成几个文件:
hello.ko
hello.mod.c
hello.mod.o
hello.o
运行命令:
# insmod hello.ko
应该可以看到返回的信息:Hello, world
然后再运行命令:
# rmmod hello
应该可以看到返回的信息:Goodbye, cruel world
如果没看到,就是输出到系统的日志文件中去了,可以查看文件:
tail -f /var/log/messages
cat /var/log/syslog
以通过 lsmod 来查看该模块是否被卸载 .
应该有信息的输出。
配置/etc/rsyslogd.conf 中kern* /dev/pts/1 表示将所有内核信息输出至虚拟控制台1