Chinaunix首页 | 论坛 | 博客
  • 博客访问: 246305
  • 博文数量: 43
  • 博客积分: 1878
  • 博客等级: 上尉
  • 技术积分: 457
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-02 11:08
文章分类

全部博文(43)

文章存档

2011年(3)

2010年(40)

分类: 嵌入式

2010-06-07 11:41:56

这段时间一直在学习内核移植,一直不断在编译和用别人的驱动模块,发现自己
越来越喜欢这件事,但是希望以后编译的是自己的驱动,有一种莫名其妙的感觉:以后
我会靠这些东西混饭吃。这又一次激发了从前的梦想,趁着这股激情,我真正的进入我
的驱动之旅!
         现在回想起来学习东西真是要脚踏实地,以前虽然看过驱动的书籍,但是都走马
观花,程序没敲几个,自以为懂,真正去学,去写的时候发现自己 连一个helloword的
程序都错误百出。
           好了,现在我们开始我们驱动最经典的helloword程序。
开发环境:ubuntu 9.04  内核树(2.6.28-11-generic)  
//hello.c
#include <linux/init.h>        // 指定你的初始化和清理函数
#include   //包含加载模块需要的函数和符号的定义
MODULE_LICENSE("Dual BSD/GPL"); // 内核认识的特定许可版本

static int hello_init(void)
{
      printk(KEAR_ALERT"Hello , World!"); //printk内核里的打印函数,KEAR_ALERT是消息的优先级
      return 0;
}

static int hello_exit(void)
{
     printk(KEAR_ALERT"GoodBye, my world");
}
module_init(hello_init); //加载模块是调用
module_exit(hello_exit);//卸载模块时调用

下面我们来编译上面的文件,
编写Makefile,如下
............................................................................................................
ifneq ($(KERNELRELEASE),)
        obj-m := hello.o            
else
        KERNELDIR ?= /lib/modules/$(shell uname -r)/build
        PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
................................................................................................................
这里我们来解释下:
obj-m:=hello.o 是指编译模块需要的目标文件
else 后面是设置编译环境,KERNELDIR 是模块目录中的符号连接到内核树
M=$(PWD) 是当前路径

然后生成
hello.c   hello.mod.c  hello.o   Makefile~       modules.order
hello.ko  hello.mod.o  Makefile  Module.markers  Module.symvers

我们来安装这个模块:

#insmod hello.ko  //然后你在查看/var/log/kern.log 最后面,成功的话就能看到hello,word
卸载这个模块
#rmmod hello.ko //查看/var/log/kern.log .成功的话就能看到GoodBye, my world

就讲到这里。


参考书籍:  linux设备驱动程序(第3版)
阅读(1312) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~