======================================================================================================
编译代码
======================================================================================================
这个是我写的makefile文件,在我台机上我没把这个模块加入到内核源码的字符设备目录下,而是放在了用户目录下面。但这个makefile文件对以上两种情况都支持:
#wjb add 2011-10-21
ifneq ($(KERNELRELEASE), )
obj-m := hellow.o
else
KERNELDIR =/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
.PHONY: modules modules_install clean
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif
======================================================================================================
模块加载&设备文件节点构造:
======================================================================================================
1. 编译成功后,会得到hellow.ko, 这时你就可以通过insmod命令加载模块
# insmod hellow.ko
这时你的日志控制台中会出现hello_init中的打印信息,如果你使用lsmod列出当前已加载模块,会发现hellow模块赫然在目:
root@Ubuntu:~/share/hellow# ls
a.out hellow.ko hellow.o Makefile Module.symvers
hellow.c hellow.mod.c main.c Makefile~
hellow.c~ hellow.mod.o main.c~ modules.order
root@ubuntu:~/share/hellow# insmod hellow.ko
root@ubuntu:~/share/hellow# dmesg | tail
[ 3711.851658] hello init. major:251, minor:0
2.要想使用驱动,你需要在/dev 目录下建立设备文件节点,语法是
mknod [options]name {bc} major minor
这里需要知道设备的主、次设备号,何以知之?使用cat /proc/devices | grep hello 你就会得到其主设备号
比如我这里得知hellow的主设备号为251
那么就用下面的命令:
root@ubuntu:~/share/hellow# mknod /dev/hellow c 251 0
c表示字符设备,这样就可以通过该设备文件操作设备了。
======================================================================================================
测试程序:
======================================================================================================
现在就可以通过系统调用操作设备了,我写了一个测试程序来调用:#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/ioctl.h>
int main(void)
{
int fd, ret;
char *buf = " Hello world !";
char temp[10] = "0";
fd = open ( "/dev/hellow" , O_RDWR);
if ( fd == -1 )
{
perror("open");
exit(0);
}
ret = write( fd, buf,strlen(buf));
if ( ret == -1 )
{
perror("write");
exit(0);
}
ret = read ( fd ,temp, strlen(temp) );
if ( ret == -1)
{
perror("read");
exit(0);
}
close(fd);
return 0;
}
root@ubuntu:~/share/hellow# gcc main.c
生成的目标文件为a.out
运行之:
root@ubuntu:~/share/hellow# ./a.outroot@ubuntu:~/share/hellow# dmesg | tail结果:
[ 4082.930492] Hello device open!
[ 4082.930520] hello: user has written 14 bytes to me: Hello world !
[ 4082.930524] hello: user read 1 bytes from me. A
[ 4082.930829] Hello device close!
当然,如果你想移除这个字符设备,可以输入如下命令:
root@ubuntu:~/share/hellow# rmmod hellow
root@ubuntu:~/share/hellow# dmesg | tail
结果显示如下信息,说明已经移除:
[ 4344.602407] hello exit. major:251,minor 0