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

2009-7-19 23:16 6053 8 9 分类: 软件与OS

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


/*hello_module.c*/


#include <linux/module.h>
#include <linux/init.h>



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设备驱动程序(第三版)》所介绍的规范来写,可以藏考该书。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

tengjingshu_112148725 2009-7-20 14:23

谢谢分享,现在还只是在mini2440上调裸奔程序呢,还没到你这步
相关推荐阅读
用户1398279 2010-07-08 00:12
C语言共享库的制作
C语言共享库的制作0推荐 作者:杨硕,华清远见嵌入式学院讲师。1)基本概念共享库也是.o文件的集合,但是这些文件由编译器按照一种特殊的方式生成(Linux中,共享库文件为"ELF"格式,共享库已经具备...
用户1398279 2010-07-04 22:37
Linux 2.6.11 MTD驱动情景分析
Linux 2.6.11 MTD驱动情景分析最近几天为了熟悉linux的驱动开发,我选择了其MTD驱动做了一些研究。我能找到的文章中我觉得有些部分不够细致,所以我还是自己写了一部分分析,希望对别人也能...
用户1398279 2010-05-05 14:25
automake使用及库和头文件的链接
automake使用及库和头文件的链接关于automake的实践今天弄了很久的automake,自动生成Makefile,这样写程序时就会方便很多。之前也花时间看过一次,但当时只是对着一个hello....
用户1398279 2010-05-05 11:33
HP总裁退休时的信件
HP总裁退休时的信件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />我有个有趣的观察...
用户1398279 2010-04-23 18:04
VMWare的NAT配置(包括DHCP和固定IP配置)
NAT的DHCP配置:这个网上别人写过,自己实验了下,没有问题。1 .最重要的是你的两个服务必须开启:VMware DHCP Service 和VMware NAT Service。具体操作如下: 开...
用户1398279 2010-04-23 10:48
gcc命令objdump用法
gcc命令objdump用法2009年03月29日 星期日 23:49gcc命令之 objdump ---------------objdump是用查看目标文件或者可执行的目标文件的构成的GCC工具-...
我要评论
1
8
关闭 站长推荐上一条 /4 下一条