这段时间一直在学习内核的移植,一直不断在编译和用别人的驱动模块,发现自己
越来越喜欢这件事,但是希望以后编译的是自己的驱动,有一种莫名其妙的感觉:以后
我会靠这些东西混饭吃。这又一次激发了从前的梦想,趁着这股激情,我真正的进入我
的驱动之旅!
现在回想起来学习东西真是要脚踏实地,以前虽然看过驱动的书籍,但是都走马
观花,程序没敲几个,自以为懂,真正去学,去写的时候发现自己
连一个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) |