Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7535010
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: LINUX

2012-07-23 16:48:03

编译模块


点击(此处)折叠或打开

  1. 如下书写你的 makefile:
  2. # If KERNELRELEASE is defined, we've been invoked from the
  3. # kernel build system and can use its language.
  4. ifneq ($(KERNELRELEASE),)

  5.  obj-m := hello.o
  6. # Otherwise we were called directly from the command
  7. # line; invoke the kernel build system.
  8. else

  9.  KERNELDIR ?= /lib/modules/$(shell uname -r)/build
  10.  PWD := $(shell pwd)
  11. default:
  12.  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

  13. endif

我们看到了扩展的 GNU make 语法在起作用. 这个 makefile 在一次典型的建立中要被读 2 . 当从命令行中调用这个 makefile , 它注意到 KERNELRELEASE 变量没有设置. 它利用这样一个事实来定位内核源码目录, 即已安装模块目录中的符号连接指回内核建立树. 如果你实际上没有运行你在为其而建立的内核, 你可以在命令行提供一个 KERNELDIR= 选项, 设置 KERNELDIR 环境变量, 或者重写 makefile 中设置 KERNELDIR 的那一行. 一旦发现内核源码树, makefile 调用 default: 目标, 来运行第 2 make 命令( makefile 里参数化成 $(MAKE))象前面描述过的一样来调用内核建立系统. 在第 2 次读, makefile 设置 obj-m, 并且内核的 makefile 文件完成实际的建立模块工作.

这种建立模块的机制你可能感觉笨拙模糊. 一旦你习惯了它, 但是, 你很可能会欣赏这种已经编排进内核建立系统的能力. 注意, 上面的不是一个完整的 makefile; 一个真正的 makefile 包含通常的目标类型来清除不要的文件, 安装模块等等. 一个完整的例子可以参考例子代码目录的 makefile.

 

加载和卸载模块

加载到内核: insmod

从内核去除模块:rmmod

模块的列表:lsmod

 

版本依赖

内核不只是认为一个给定模块是针对一个正确的内核版本建立的. 建立过程的其中一步是对一个当前内核树中的文件(称为 vermagic.o)连接你的模块; 这个东东含有相当多的有关要为其建立模块的内核的信息, 包括目标内核版本, 编译器版本, 以及许多重要配置变量的设置. 当尝试加载一个模块, 这些信息被检查与运行内核的兼容性. 如果不匹配, 模块不会加载; 代之的是你见到如下内容:

# insmod hello.koError inserting './hello.ko': -1 Invalid module format

看一下系统日志文件(/var/log/message 或者任何你的系统被配置来用的)将发现导致模块无法加载特定的问题.

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