Chinaunix首页 | 论坛 | 博客
  • 博客访问: 388436
  • 博文数量: 115
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 1009
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-23 17:05
文章分类

全部博文(115)

文章存档

2011年(2)

2010年(86)

2009年(27)

我的朋友

分类: LINUX

2009-10-09 21:42:33

嵌入式Linux驱动程序入门之--Hello world!

        最近在友善之臂的mini2440开发板上移植了Linux2.6.29.1内核和yaffs2文件系统后,准备学习Linux设备驱动设计,买了本《Linux设备驱动程序(第三版)》,觉得是本非常不错的书,刚买的第一天,我看了前两章,感觉是非常不错的书,因为它主要讲的是驱动设计的原理和所遵循的规范,以及注意的问题,而不是主要讲具体的设计和实现。知道原理,再结合实例,这一直是我所追求的学习方法。下面介绍我的第一个Linux驱动程序“Hello world!”,“Hello world”也许是第一个程序员写的程序吧,这里我也从写它开始,尽管它很简单,但它记录了我学习Linux的过程。

/*hello_module.c*/

#include
#include


static int __init mini2440_hello_module_init(void)
{
    printk("Hello, Mini2440 module is installed !\n");
    return 0;
}

static void __exit mini2440_hello_module_cleanup(void)
{
    printk("Good-bye, Mini2440 module was removed!\n");
}

module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");


简单的分析:本程序中所用到的头文件“linux/module.h”和“linux/init.h”在所有的模块代码中都应该包含。MODULE_LICENSE("GPL");是内核模块所遵循的许可证。函数用__init来修饰,标明函数仅在初始化期间使用,当模块被装载后将该初始化函数扔掉,把函数占用的内存释放出来。初始化函数也可以不加__init修饰,只是占用一部分内存而已,并且该初始化函数还可以被其它函数调用。__exit修饰词标记该代码用于模块卸载,其它的任何时候调用该函数将出错。
模块的Makefile文件如下:

obj-m:=hello_module.o
CURRENT_PATH:=$(shell pwd)
ARM_LINUX_KERNEL:=/opt/linux-2.6.29.1
all:
 $(MAKE) -C $(ARM_LINUX_KERNEL) SUBDIRS=$(CURRENT_PATH) modules
clean:
 rm -rf *.cmd *.o *.ko  *.mod.c *.symvers *.order

简单分析一下:obj-m=hello_module.o表明我们最终要构造的模块是hello_module.ko,ARM_LINUX_KERNEL:=/opt/linux-2.6.29.1指明内核所在的路径,其它的都遵循《Linux设备驱动程序(第三版)》所介绍的规范来写,可以藏考该书。

 
                                                     交流邮箱:
阅读(1041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~