Chinaunix首页 | 论坛 | 博客
  • 博客访问: 212184
  • 博文数量: 30
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 272
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-11 13:39
个人简介

天行健,君子以自强不息;地势坤,君子以厚德载物;

文章分类

全部博文(30)

文章存档

2017年(7)

2016年(3)

2015年(6)

2013年(14)

我的朋友

分类: 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

阅读(2071) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~