转:http://www.groad.net/bbs/read.php?tid-1006.html

通过以下命令加载上面编译生成的模块
引用
linux-beyes:/home/beyes/C/kernel # insmod ./hello.ko


注意的是,如果使用在图形系统下的虚拟终端,那不会看到输出信息,但是这些信息一般被保存在 /var/log/messages 文件里:
引用
linux-beyes:/home/beyes/C/kernel # cat /var/log/messages | grep hello
Aug  7 01:55:35 linux-beyes kernel: hello linux kernel



卸载模块使用 rmmod 命令
引用
rmmod hello


卸载模块时,如果是是在图形系统下的虚拟终端,那么退出信息同样保存在 /var/log/messages 文件里:
引用
linux-beyes:/home/beyes/C/kernel # cat /var/log/messages | grep bye
Aug  7 02:02:56 linux-beyes kernel: bye..lwave from the kernel
如果编译时出现:
引用
  ERROR: Kernel configuration is invalid.
         include/linux/autoconf.h or include/config/auto.conf are missing.
         Run ' make oldconfig && make prepare' on kernel src to fix it.

可以尝试:
引用
make oldconfig
make prepare

make oldconfig    : 基于已有的.config进行配置, 若有新的符号, 它将询问用户.

这时候再编译,可能会出现:
引用
/bin/sh: scripts/mod/modpost: 没有那个文件或目录
make[1]: *** [__modpost] 错误 127
make: *** [modules] 错误 2

再使用下面命令:
引用
make scripts

最后编译成功。

如果出现
引用
  insmod:error inserting 'hello.ko': -1 Invalid module format

错误,则查看日志文件tail /var/log/messages 文件,若是提示 "no symbol version for module_layout" 错误,则使用以下语句编译:
引用
make -C /lib/modules/`uname -r`/build M=`pwd` modules

而不是直接在 -C 参数后填上 /usr/src/linux-.2.6.xxx 这样的路径直接指向内核源码树,因为按照错误提示,应该是找不到 modules.symbols 文件所致。

关于 /lib/modules 目录的说明:

该目录包含了内核模块及其他文件. 注意, modules中一般会有多个目录: 系统自带的内核模块在这里, 你编译自己的内核模块后, 它们也会被安装到这里. 不同的目录由内核版本号来区分. 即modules里目录的名称是内核版本号. (使用$ uname -r 可知当前系统内核所用的模块位于哪个目录).

/lib/modules/<kernel-version>/build
储存为该版本的内核编译新模块所需的文件. 包括Makefile, .config, module.symVers(模块符号信息), 内核头文件(位于include/, include/asm/中)

/lib/modules/<kernel-version>/kernel
储存内核目标文件(以.ko为后缀). 它的目录组织和内核源代码中kernel的目录组织相同.

/lib/modules/<kernel-version>/中:
modules.alias       : 模块别名定义. 模块加载工具使用它来加载相应的模块.
modules.dep        : 定义了模块间的依赖关系.
modules.symbols : 指定符号属于哪个模块.

这些文件都是文本文件, 可以查看它们.