照着《Professional Linux Programming》上的来写的。然后过程中遇到一系列问题,在这里记录下来。

我的系统是VMware下装的Fedora 16。

代码如下

  1. #include
  2. #include
  3. int __int hello_init(void)
  4. {
  5. printk(“plp: hello reader!\n”);
  6. return 0
  7. }
  8. void __exit hello_exit(void)
  9. {
  10. printk(“plp: thanks for all the fish!\n”);
  11. }
  12. MODULE_AUTHOR(“Jon Masters jcm@jonmasters.org);
  13. MODULE_DESCRIPTION(“PLP example”);
  14. MODULE_LICENSE(“GPL”);
  15. module_init(hello_init);
  16. module_exit(hello_exit);

然后你可以用 make -C /usr/src/linux-3.6.8 modules M=$PWD来编译这个可装载模块,在当前文件夹下需要一个Makefile文件,里面写上obj-m := plp.o

解释下这条语句。-C 后面的参数 是你当前系统的代码所在的位置,貌似需要先编译下系统,可以下载最新版的内核来编译。 modules 应该是告诉make这是要编译啥 然后M=$PWD是参数 表示当前可装载模块在哪。当然你可以把这些放到一个Makefile文件里面。效果是一样的。如果你看到有CC [M] …..这样的那应该就是好了。

然后编译好了之后你就可以用/sbin/modinfo plp.ko来查看这个可装载模块的相关信息了。这里面可以看到是什么版本的内核。也就是前面你所指定的内核目录相对应的内核版本。

最后你可以用/sbin/insmod plp.ko和/sbin/rmmod plp来装载这个模块和删除这个模块。

本来到这里就结束了。不过这里再记录下我所遇到的错误。

1.make的时候出错。原因是没有写Makefile文件,Makefile文件里面只需要写上obj-m := plp.o就行了。

2./sbin/insmod plp.ko的时候出现Operation not permitted,这里是因为没有权限,需要用root执行。

3.用root执行上述命令的时候,出现“Invalid module format”错误。这个是因为内核版本不一致。我编译了3.6.8的内核之后,进入的系统内核版本是3.1的。所以会报错。

4.printk没有输出。这个是因为输出等级的原因,所以不会输出在控制台。但是你可以用dmesg来查看。一般来说就是最后几条。或者你也可以查看/var/log/messages里面的信息,也是最后几条。貌似可以改输出等级。使得输出在控制台。这个和printk函数有关。printk和printf的用法差不多,不过是用在内核输出,printf用在用户态。

Comments