免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2358 | 回复: 9
打印 上一主题 下一主题

一个关于linux内核模块编程的基础问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-28 15:09 |只看该作者 |倒序浏览
平台 redhat 8.0 内核 2.4.18-14

  1. /* hello.c */

  2. /* The necessary header files */

  3. /* Standard in kernel modules */
  4. #include <linux/kernel.h>;   /* We're doing kernel work */
  5. #include <linux/module.h>;   /* Specifically, a module */

  6. /* Deal with CONFIG_MODVERSIONS */
  7. #if CONFIG_MODVERSIONS==1
  8. #define MODVERSIONS
  9. #include <linux/modversions.h>;
  10. #endif        


  11. /* Initialize the module */
  12. int init_module()
  13. {
  14.   printk("Hello, world - this is the kernel speaking\n");

  15.   /* If we return a non zero value, it means that
  16.    * init_module failed and the kernel module
  17.    * can't be loaded */
  18.   return 0;
  19. }


  20. /* Cleanup - undid whatever init_module did */
  21. void cleanup_module()
  22. {
  23.   printk("Short is the life of a kernel module\n");
  24. }
复制代码

  1. # Makefile for a basic kernel module

  2. CC=gcc
  3. MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX

  4. hello.o:        hello.c /usr/include/linux/version.h
  5.                 $(CC) $(MODCFLAGS) -c hello.c
  6.                 echo insmod hello.o to turn it on
  7.                 echo rmmod hello to turn if off
  8.                 echo
  9.                 echo X and kernel programming do not mix.
  10.                 echo Do the insmod and rmmod from outside X
复制代码

问题一:
我在执行make后有这样一句警告:
hello.c: In function `init_module':
hello.c:27: warning: implicit declaration of function `printk'

意思应该是 对printk函数的声明模糊,请问如何解决这个警告问题?

问题二:
我试图用insmod命令将 hello.o插入内核中,但系统返回如下信息:
hello.o: kernel-module version mismatch
        hello.o was compiled for kernel version 2.4.9-9
        while this kernel is version 2.4.18-14.

意思应该是说 内核版本的冲突问题。

请问应如何解决该问题?

论坛徽章:
0
2 [报告]
发表于 2005-03-28 15:28 |只看该作者

一个关于linux内核模块编程的基础问题

"hello.o: hello.c /usr/include/linux/version.h "

你应该用/usr/src/linux/include下的头头文件

论坛徽章:
0
3 [报告]
发表于 2005-03-28 18:44 |只看该作者

一个关于linux内核模块编程的基础问题

在我的系统中 /usr/src 下面的东西都是空的。

但是我把/usr/include/linux/version.h文件的内容做了一下修改。
也就是把里面的版本的宏定义做了下修改,把2.4.9-9改成了2.4.18-14

然后进行make

系统给出以下信息

  1. [root@Ruian wys]# insmod hello.o
  2. Warning: loading hello.o will taint the kernel: no license
  3.   See http://www.tux.org/lkml/#export-tainted for information about tainted modules
  4. Module hello loaded, with warnings
复制代码


然后我查看/proc下的modules文件
可以找到模块 hello,状态是unused

然后我试图rmmod, 但是系统说 hello模块并未加载到内核中。

请高手指点下我,怎么才能把该模块加载进去。
或者给我提供点关于这方面的电子书籍。

论坛徽章:
0
4 [报告]
发表于 2005-03-28 22:24 |只看该作者

一个关于linux内核模块编程的基础问题

/usr/src是空的说明你的系统没有安装内核源代码。

论坛徽章:
0
5 [报告]
发表于 2005-09-14 19:55 |只看该作者

一个关于linux内核模块编程的基础问题

printk("<1>;hello\n";

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-09-14 20:00 |只看该作者

一个关于linux内核模块编程的基础问题

[root@Ruian wys]# insmod hello.o
Warning: loading hello.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module hello loaded, with warnings


#include .....................后加一句.

MODULE_LICENSE("GPL";

论坛徽章:
0
7 [报告]
发表于 2005-09-14 20:06 |只看该作者

一个关于linux内核模块编程的基础问题

  1. #ifndef __KERNEL__
  2.         #define __KERNEL__
  3. #endif
  4. #ifndef MODULE
  5.         #define MODULE
  6. #endif
  7. #ifdef MODVERSIONS
  8.         #include <linux/version.h>;
  9. #endif

  10. #include <linux/kernel.h>;
  11. #include <linux/module.h>;
  12. #include <linux/init.h>;
  13. #include <linux/string.h>;
复制代码


模块源代码的一开始,加上这几句吧。 我只是列出一些常用的头文件,如果你有用到不太常用的内核API,还要包含相关的头文件。
内核API没有象man那样的文档,确实不太方便,我都是用Vim的:ts symbol来查看在哪个头文件里的。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-09-14 20:08 |只看该作者

一个关于linux内核模块编程的基础问题

>;>;我都是用Vim的:ts symbol来查看在哪个头文件里的。
大哥这个具体怎么用啊.我一直没用明白.

论坛徽章:
0
9 [报告]
发表于 2005-09-14 20:14 |只看该作者

一个关于linux内核模块编程的基础问题

原帖由 "mq110" 发表:
>;>;我都是用Vim的:ts symbol来查看在哪个头文件里的。
大哥这个具体怎么用啊.我一直没用明白.


在源码的顶级目录生成一个tags文件(不包括drivers目录,也不包括i386以外的体系结构,不然太大了),然后打开,在Vim中:ts kmalloc,就知道它在<linux/slab.h>;中声明了。

下面是linuxforum内核版斑竹wheelz大侠的《用tags/cscope看内核源代码-HOWTO》:
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=linuxK&Number=573982&page=0&view=collapsed&sb=5&o=all&fpart=

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-09-14 20:29 |只看该作者

一个关于linux内核模块编程的基础问题

刚才实验了 太牛了.谢谢 大哥.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP