Linux系统开发专栏

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

   学了那么多程序语言,总是有一个Hello world开头,不禁感叹Hello world的强大。呵呵,废话少说,咋们的故事当然要从这个Hello world开始。

(1)linux开源当然少不了源代码的贡献,请看下边(至于什么是开源,悲剧的我现在也没整明白):

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
      printk(KERN_ALERT "Hello,world\n");
      return 0;
}

static void hello_exit(void)
{
      printk(KERN_ALERT "Goodbye,Cruel world\n");

}

module_init(hello_init);
module_exit(hello_exit);

    看到这里我们明白了,驱动程序说白了就是提供函数借口给用户空间的程序调用。在c语言中都有main()入口,那设备驱动程序的入口在哪儿呢?你猜对了,就是module_init(),它的参数是一个函数指针,告诉说咋们的入口在hello_init()。明白这层意思,module_exit()就不用多说了吧..

(2)连源码都给你了,也就不吝啬一个makefile了如下:

ifneq ($(KERNELRELEASE),)
     obj-m := hello.o
else
     KERNELDIR :=/lib/modules/$(shell uname -r)/build
     PWD := $(shell pwd)
all:
     $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
endif
clean:
     rm -f *.o *.ko *.mod.c .hello*

     千万不要说不懂makefile,大千世界,连地图都不懂,也不知道咋混的。这里要说的是 $(MAKE) 这里一定是大写MAKE,我开始小写,怎么都过不去,郁闷啊..

     $(MAKE) -C $(KERNELDIR) SUBDIRS = $(PWD) modules这句啥意思?就是说首先改变目录到-C选项指定的目录(即内核源代码目录),其中保存了内核的顶层makefile文件。SUBDIRS=选项让该makefile在构造modules目标返回之前到模块源代码目录。然后,modules目标指向obj-m变量设定的模块。(其实,这样的写Makefile命令还是有些烦人,可有啥办法呢,谁让咱们是笨鸟,聪明的方法?有,那要见下篇介绍-----聪明的makefile,嘿嘿)。

(3)好了,该有的都有了,不该有的咋一点也不贪。下面make一番:

[root@localhost ~]#make
make -C /lib/modules/2.6.29.4-167.fc11.i686.PAE/build SUBDIRS=/root/device modules
make[1]: Entering directory `/usr/src/kernels/2.6.29.4-167.fc11.i686.PAE'
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/device/hello.mod.o
  LD [M]  /root/device/hello.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.29.4-167.fc11.i686.PAE'

这是生成了hello.ko模块(如果没有,是有八九就是makefile有问题,还说会写,露了原形吧),接下来可以看结果了

首先再打开一个终端B(刚才make的那个不要关了,叫它A吧),像这样[root@localhost ~]#tail -f /var/log/messages 

然后在A终端输入[root@localhost ~]#insmod ./hello.ko   哈哈在B终端是不是看到了localhost kernel:hello,world

然后在A终端输入[root@localhost ~]#rmmod hello          哈哈在B终端是不是看到了localhost kernel:Goodbye,Cruel world

   至此,一个最简单的helloworld的设备驱动演示程序就完成了,是不是挺好玩,关键是挺兴奋,这才是关键。哈哈

   当工人就得劳动;当军人就的准备打仗(不然某些人老是欺负咋们了不是),所以嘛,当程序员,就一定要在最后来个说明注意什么的,烦躁啊..

   那就说明吧:这个helloworld,我建议在fedora11下实现,在centos或redhat或那些我没试过的,是有些问题的。这主要是要在某些系统下是不支持模块的,这就要重新编译内核,选上“Enable loadable module support”,这样才可以。你偏要忘北走,我也不能用个绳子套着你喝水是吧,不管了,反正我今天关心的helloworld完成了,这难道就是传说中的责任分工,那个?呵呵,等着,我改天一定不上。

posted on 2010-10-01 10:18  ☆&寒 烟☆  阅读(11496)  评论(6编辑  收藏  举报