Chinaunix首页 | 论坛 | 博客
  • 博客访问: 130784
  • 博文数量: 75
  • 博客积分: 1485
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-11 20:57
文章分类
文章存档

2011年(1)

2010年(15)

2009年(59)

我的朋友

分类: LINUX

2009-05-11 22:16:18

进入初学者共同的第一个驱动程序Hello world!

#include <linux/kernel.h> /*用于实现内核中的printk函数,与用户空间用printf不同,内核空间要用printk */
#include <linux/module.h> /* Needed by all modules */
MODULE_LICENSE("Dual BSD/GPL"); /*模块许可证声明,若无,模块被加载时将收到内核被污染的警告*/
static int hello_init(void) /*使用static为程序模块化、通用化提供方便*/
{
       printk(KERN_ALERT "Hello,linux!\n"); /*KERN_ALERT为输出级别*/
       return 0;
}
static void hello_exit(void)
{
       printk(KERN_ALERT "Goodbye,hello\n");
}
module_init(hello_init); /*模块加载函数必须以module_init(函数名)的形式被指定,初始化成功返回0*/
module_exit(hello_exit); /*模块卸载函数必须以module_exit(函数名)的形式被指定,无返回值*/

接下来为hello world写了简单的Makefile:

obj-m :=hello.o    # obj-m表示该文件要作为模块编译。

然后是Kconfig文件

config hello
       tristate "Mini2440/QQ2440 module sample"    /*指定类型tristate,后跟输入提示*/
       depends on ARCH_S3C2410  /*依赖关系*/
       default m if MACH_FRIENDLY_ARM_MINI2440 
       help               /*帮助信息*/
         Mini2440/QQ2440 module sample.

生成hello.ko文件

[root@localhost hellomod]# make -C /opt/FriendlyARM/mini2440/linux-2.6.29/ M=$(pwd) modules

将hello.ko文件下载到开发板运行

[root@FriendlyARM /]# insmod hello.ko
Hello,
[root@FriendlyARM /]# rmmod hello.ko
[root@FriendlyARM /]# rmmod hello
Goodbye,hello
rmmod: module 'hello' not found

这样一个简单的hello module就这样完成了,在试验过程中还是遇到了不少问题。

(1)在模块编译后下到开发板运行出现过“insmod: cannot insert 'hello.ko': invalid module format”,这是因为编译模块的时候不了解版本依赖的问题,编译的时候我指定的是fedora的内核源代码目录,而没有选择友善提供的linux-2.6.29目录,导致出现问题,在linux设备驱动开发第三版第二章平台依赖性里有说明。                        

(2)在在卸载模块rmmod hello后,不知道Goodbye,hello后面为什么突然多了一句rmmod: module 'hello' not found,在做下一个驱动试验室希望能够找出这个问题。

疑问:

对Kconfig中的这一句不太理解 default m if MACH_FRIENDLY_ARM_MINI2440 

阅读(1185) | 评论(1) | 转发(0) |
0

上一篇:开通Chinanuix博客

下一篇:名字空间污染

给主人留下些什么吧!~~

chinaunix网友2009-11-26 15:28:07

default m 指的是在配置界面默认将该驱动编译为模块,