Chinaunix首页 | 论坛 | 博客
  • 博客访问: 581871
  • 博文数量: 146
  • 博客积分: 5251
  • 博客等级: 大校
  • 技术积分: 1767
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-10 15:58
文章分类
文章存档

2010年(12)

2008年(129)

2007年(5)

我的朋友

分类: LINUX

2008-11-10 16:07:28

需要使用内核源代码的 Fedora Core 用户可以在内核 .src.rpm 软件包中找到它们。要从文件释放源码树,执行下面的命令:

注:不要以超级用户身份构建软件包以超级用户身份构建软件包是极其危险的,不应当这样做,即使是内核。下面的操作使您可以以普通用户身份构建内核。很多教程以 /usr/src/linux 作为内核的源码位置,如果想遵循这些操作,可以替换为 ~/rpmbuild/BUILD/kernel-/linux-


1、在个人目录准备 RPM 软件包构建环境,运行下面的命令:

su -c 'yum install fedora-rpmdevtools'
fedora-buildrpmtree提示时输入 root 的密码。

2、从下列来源之一获取 kernel-version.src.rpm 文件:

1)SRPMS 文件,包含在合适的 SRPMS CD iso 镜像文件中。

2)下载内核软件包的 HTTP 或 FTP 站点

3)执行这个命令:
       su -c 'yum install yum-utils'
          su -c 'yumdownloader --source kernel'提示时输入 root 的密码。

3、安装 kernel-<version>.src.rpm,运行命令:

        rpm -Uvh kernel-.src.rpm`
     这个命令将 RPM 内容写到 ${HOME}/rpmbuild/SOURCES 和 ${HOME}/rpmbuild/SPECS, 这里 ${HOME} 是您的个人目录。

注:硬盘空间需求完整的内核构建过程可能需要您的个人目录有几个吉的存储空间。


4、使用这样的命令来准备内核源代码:

        cd ~/rpmbuild/SPECS
            rpmbuild -bp --target $(uname -m) kernel-2.6.spec
    内核源码树位于 ${HOME}/rpmbuild/BUILD/kernel-/ 目录。

注:这一步可能会报很多warning,不用管它。

5、Fedora Core 附带的内核配置文件在 configs/ 目录。例如,i686 SMP 配置文件被命名为 configs/kernel-version-i686-smp.config。使用下列命令来将需要的配置文件复制到合适的位置,用来编译:

     cp configs/ .config
      您也可以在 /lib/modules/version/build/.config 这个位置找到与您当前的内核匹配的 .config 文件。

6、每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核 Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile 经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的 Makefile。

例如,如果 uname -r 返回字符串 2.6.15-1.1948_FC5,就将 EXTRAVERSION 定义从:

       EXTRAVERSION = -prep   修改为:

       EXTRAVERSION = -1.1948_FC5
     也就是最后一个连字符后面的所有内容。

7、执行这个命令:

         make oldconfig
接下来就没什么差别了。


测试代码:
/*hello.c*/
#include
#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 World\n" );
}

module_init(hello_init);
module_exit(hello_exit);

Makefile:

TARGET = hello
KDIR = /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
obj-m := $(TARGET).o
default:
        make -C $(KDIR) M=$(PWD) modules


生成hello.ko

ok,成功了!:mrgreen:
执行以下命令:
insmod hello.ko
rmmod hello.ko


然后:执行 dmesg
真的成功了!!!
Hello World
Goodbye World
阅读(1381) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~