Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108868
  • 博文数量: 40
  • 博客积分: 2058
  • 博客等级: 大尉
  • 技术积分: 409
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-07 16:49
文章分类

全部博文(40)

文章存档

2011年(3)

2010年(17)

2009年(14)

2008年(6)

我的朋友

分类: LINUX

2010-04-05 15:34:50


第一次接触内核的模块编译,老师说其实一点都不难就从一个简单的“hello  world ”写起。于是就尝试着去写了一个,到最后才发现些不是问题,问题是编译!
先晒程序,再说问题;
hello.c
#include
#include
#include
MODULE_LICENSE("Dual BSD/GPL");

static int init1_module(void)
{    
    printk("<1> Hello world!");
    return 0;
}
static void cleanup1_module(void)
{
    printk("<1> Goodbye!\n");
}

module_init(init1_module);
module_exit(cleanup1_module);
Makefile 编写如下:
obj-m +=hello.o #产生hellomod模块的目标文件
CURRENT_PATH :=$(shell pwd)
LINUX_KERNEL :=$(shell uname -r)
LINUX_KERNEL_PATH :=/usr/src/kernels/$(LINUX_KERNEL)
#LINUX_KERNEL_PATH := /lib/modules/$(LINUX_KERNEL)/build
all:
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
刚开始编译的时候出现:

[tiger@z kerner]$ make
make -C /usr/src/kerners/2.6.29.4-167.fc11.i686.PAE M=/home/tiger/code/OS/kerner modules
make: *** /usr/src/kerners/2.6.29.4-167.fc11.i686.PAE: No such file or directory.  Stop.
make: *** [all] Error 2
于是就到/usr/src/kernels/目录看了以下,什么都没有,又蒋LINUX_KERNEL_PARH 改为/lib/modules/$(LINUX_KERNEL)/build,看到build这个文件连接到/usr/src/kernels/ 目录下,由于对系统不熟悉,我以为要蒋源代码下载下来解压到/usr/src/kernels/下,在下源代码的时候上网问了下网友说是包没有安装完全,于是在网上找了一下主要是缺少一个kernel-devel 于是用命令行
sudo yum install kernel-devel
安装完成后/usr/src/kernel目录下出现一个 2.6.30.10-105.2.23.fc11.i686.PAE目录,里边还有好多文件(终于明白了为什么编译的时候要加上内核路径[LINUX _KERNEK_PATH]的原因)。(其实,蒋内核源代码下载下来后编译一下也可以)
    以为现在没问题了吧,于是重新编译,出现
[tiger@z kerner]$ make
make -C /usr/src/kerners/2.6.29.4-167.fc11.i686.PAE M=/home/tiger/code/OS/kerner modules
make: *** /usr/src/kerners/2.6.29.4-167.fc11.i686.PAE: No such file or directory.  Stop.
make: *** [all] Error 2
郁闷了好久,才发现
[tiger@z kerner]$ uname -r
 2.6.29.4-167.fc11.i686.PAE M  
而我/usr/src/kernel/目录下是2.6.30.10-105.2.23.fc11.i686.PAE。呵呵想了一个投机取巧的办法,
 cd /usr/src/kernel/
Cp 2.6.30.10-105.2.23.fc11.i686.PAE  2.6.29.4-167.fc11.i686.PAE M
果然在编译的时候就通过了,而且生成了hello.ko文件,
[tiger@z kerner]$ sudo  insmod hello.ko 出现
 Illegal insertion
很郁闷,看来投机取巧还真不行阿,2.6.29和2.6.30 的差异还真大。于是就在网上找 2.6.29.4-167.fc11.i686.PAE M 安装包,不过能用到的还真没找到,看来此路不通得另想办法了。
查看了一下可用的内核
sh-4.0$ sudo yum list kernel
[sudo] password for tiger:
Available Packages
kernel.i586                   2.6.30.10-105.2.23.fc11                 updates
呵呵,于是考虑从新换一个。
Sudo vim  /boot/grub/menu.list
 让系统启动
title Fedora (2.6.30.10-105.2.23.fc11.i686.PAE)                             
 15         root (hd0,5)
 16         kernel /boot/vmlinuz-2.6.30.10-105.2.23.fc11.i686.PAE ro                root=UUID=c7709f18-b1f9-486e-9576-74909bc35a91 rhgb quiet
 17         initrd /boot/initrd-2.6.30.10-105.2.23.fc11.i686.PAE.img
变为可用。
然后重启电脑,模块正确编译通过,加载和卸载模块也正常。:)
出现了一个与此无关的问题就是我是shell终端出现问题,不能正确显示当前路径,还有就是文件夹和文件没有明显的区分。就像先前用的是ls 命令出现的效果,而现在却是用dir命令出现的效果。初步感觉是/etc/bashrc的问题,但创建新用户后却和先前一样。于是想可能是..bashrc的问题。现在还正在修改中……

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