Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153946
  • 博文数量: 15
  • 博客积分: 2146
  • 博客等级: 大尉
  • 技术积分: 370
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-20 21:20
文章分类

全部博文(15)

文章存档

2011年(6)

2008年(9)

我的朋友

分类: LINUX

2008-07-19 13:39:37

  关于 linux 内核 2.6 的模块编 译问题
(以 unbutu7.04 为例)
    在参考 关于 linux 内核时,由于在内核模块编译时需要编写 Makefile 文
件,其基本格式如下:
obj-m := hello.o
KERNELDIR := /usr/src/kernels/linux-2.6.24/
modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
其中,KERNELDIR 的作用是指出 linux 源代码所在,并从中找出起顶层的 Makefile 文件,但是在
unbutu 中,/usr/src/kernels/目录是不存在的,如何寻找到在内核模块中必须用到的 modules 目录,
通过 shell 命令 whereis modules
ghost@ghost-desktop:~/Desktop/testzone/linux$ whereis modules
modules: /etc/modules /lib/modules /usr/share/man/man5/modules.5.gz
        通过上述查找结果可以看出,/etc 下一般都是系统的配置文件,/usr 下一般含所有的命令、库
文件、manual pages 以及正常操作时所需的其他一些非改变文件,所有的文件都应该是通用的而非特定
地用于某台给定的机器。 所以/lib 一般是系统的链接库文件,此时 modules。
 进入此/modules 目录:
ghost@ghost-desktop:/lib/modules$ ls
2.6.20-15-generic   2.6.20.3-ubuntu1
2.6.20-15-generic 一般含有 kernel 涉及到的 Makefile 文件。
ghost@ghost-desktop:/lib/modules/2.6.20-15-generic$ ls
build     modules.alias          modules.inputmap     modules.seriomap
initrd    modules.ccwmap          modules.isapnpmap   modules.symbols
kernel     modules.dep            modules.ofmap        modules.usbmap
madwifi    modules.ieee1394map   modules.pcimap       volatile
此时,可以定义 Makefile 文件的内容
obj-m := hello.o
KERNELDIR := /lib/modules/2.6.20-15-generic/build
modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
       rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
就可以进行内核模块的编译和加载了。
使用到的命令:(以下命令必须在 root 权限下来执行)
make 编译
insmod hello.ko 插入模块
lsmod 查看载入模块
rmmod hello 删除模块
dmesg 查看日志
       其实即便是系统没有自动安装源码,也可以通过下载一个源码包,通过编译内核来实现。
基本编译步骤:
make oldconfig    #对内核进行一个基本配置,可对内核进行裁剪,但建议第一次编译内核的,直接
                          #  通过该步骤
make
make bzImage
make modules /* 编译 模块 */
make modules_install /* 安装 模块 */
具体方法是:
开始执行 make.一般有一个小时吧,建议将该过程抛至后台执行,同时要保证空间足够(,由于完整编译
需要比较大的空间)
如下编译方式:
ghost@ghost:/usr/src/linux-source-2.6.20$ make &
ghost@ghost:/usr/src/linux-source-2.6.20$ make bzImage &
当然,第一个 make 也可以不执行,直接 make bzImage。执行结束后,可以看到在当前目录下生成了一
个新的文件: vmlinux, 其属性为-rwxr-xr-x。
然后 :
root@ghost:/usr/src/linux-source-2.6.20#make modules /* 编译模块 */
root@ghost:/usr/src/linux-source-2.6.20#make modules_install /* 安装模块 */
       执行结束之后,会在/lib/modules 下生成新的目录/lib/modules/2.6.20-15-generic/
 在随后的编译模块文件时,要用到这个路径下的 build 目录(同上:/lib/modules/2.6.20-15-
generic/build ).
至此,内核编译完成,内核树就建立.可以重启一下系统。

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