Linux字符设备驱动入门(2)

======================================================================================================

编译代码

======================================================================================================

        这个是我写的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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyszdd.html