虚拟一个简单的字符设备驱动,在Red Hat2.4.20-8下通过:(该程序采用转自网络的代码修改而成,详细情况请查看http://bbs.whnet.edu.cn/main.html :Linux版块 —–>精华区—–> 编程解疑—–> linux课设总结之字符设备驱动)

1,编写源文件:

#define  __NO_VERSION__ 
#include<linux/version.h> /*以下是本程序包含的头文件*/
#include<linux/module.h>
#include<linux/config.h>
#include<asm/uaccess.h>
#include<linux/types.h>
#include<linux/fs.h> 
#include<linux/mm.h>
#include<linux/errno.h>
#include<asm/segment.h>
#define BUFSIZE 256  /*设备中包含的最大字符数*/

char * temp;  /*该指针用于为这个虚拟的设备分配内存空间*/
unsigned int major = 0;
static ssize_t device_read(struct file * file,char * buf,size_t count,loff_t * f_pos)
{
 int i;
 if(count>BUFSIZE){  /*如果要求读出的数目多于设备固有的数目则提示并返回*/
 printk("Can’t Read , the Count is to Big !\n");
 return  -EFAULT;
 }
 for(i = 0;i < count;i++)  /*否则,进行读出操作*/
  {__put_user(temp[i],buf);
         buf++;
        }    
 return count;
}

static ssize_t device_write(struct file * file,const char * buf,size_t count,loff_t * f_pos)
{
 int i;
 if(count>BUFSIZE){  /*要求写入的数目比设备的容量大则提示并返回*/
 printk("Can’t Write , the Count is to Big\n");  
 return  -EFAULT;
 }
 for(i = 0;i < count;i++)  /*否则,进行写入操作*/
  {__get_user(temp[i],buf);
         buf++;
        }    
 return count;
}

static int device_open(struct inode * inode,struct file * file) /*打开设备函数*/
{
 temp = (char *)kmalloc(BUFSIZE,GFP_KERNEL);  /*为设备分配内存空间*/
 MOD_INC_USE_COUNT;
 return 0;
}

static int device_release(struct inode * inode,struct file * file)
{
 kfree(temp);   /*释放设备占用内存空间*/
 MOD_DEC_USE_COUNT;
 return 0;
}

struct file_operations fops = { /*填充file_operations结构*/
 read:device_read,
        write:device_write,
        open:device_open,
        release:device_release
};
   
int init_module(void)  /*登记设备函数,insmod时调用*/
{
 int num;
 num = register_chrdev(0,"mydriver",&fops); /*系统自动返回一个未被占用的设备号*/
 if(num < 0){     /*登记未成功,提示并返回*/
  printk("Can’t Got the Major Number !\n");
    return num;
 }
 if(major == 0)
 major = num;
 return 0;
}

void cleanup_module(void)  /*释放设备函数,rmmod时调用*/
{
 unregister_chrdev(major,"mydriver");
}

命名为"mydriver.c"

2,编译文件:

gcc -O2 -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4.20-8/include -c mydriver.c

3,装载驱动:

insmod -f mydriver.o

用:lsmod可以看到mydriver.o

用:cat /proc/mydevice查看该设备的主设备号,在我的系统上为254

4,创建设备文件:mknod /dev/myDriver c 254 0 (其中myDriver为文件名,注意和下面的测试程序中打开的文件名一致,c代表此为字符设备,254位主设备号,0为从设备号,一般为0)
5,编译测试程序:test.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(void)
{
 int fd;
 int i;
  char *buf="1234567890abcdefghij\n";
  char buf1[22];
 
 fd = open("/dev/myDriver",O_RDWR); /*此处myDriver和建立设备文件时的名称一致*/
 if (fd == -1)
 {
  printf("Can’t open file \n");
  exit(-1);
 }   
 write(fd,buf,22);
 read(fd,buf1,22);
 for(i=0;i<22;i++)
    printf("%c",buf1[i]);
 close(fd);
 return 0;
}

编译并运行:gcc test.c -o test

                       ./test

注:以上只声明了增加驱动程序的步骤和给出了源代码 ,详细情况请见文首的链接。


评论

该日志第一篇评论

发表评论

评论也有版权!