background image

  read() 函数的功能就是从硬设备或内核内存中读取或复制 count 个字节到 buf 指定的
缓冲区中。在复制数据时要注意,驱动程序运行在内核中,而 buf 指定的缓冲区在用户内
存区中,是不能直接在内核中访问使用的,因此,必须使用特殊的复制函数来完成复制
工作,这些函数在<asm/ segment.h>中定义:

void put_user_byte (char data_byte ,char * u_addr) ;

void put_user_word (short data_word ,short * u_addr) ;
void put_user_long(long data_long ,long * u_addr) ;

void memcpy_tofs (void * u_addr ,void * k_addr ,unsigned long cnt) ;

  参数 u_addr 为用户空间地址,k_addr 为内核空间地址,cnt 为字节数。

  write( ) 函数 当设备特殊文件进行 write () 系统调用时,将调用驱动程序的 write () 
函数:

void write (struct inode * inode ,struct file * file ,char * buf ,int count) ;

  write ()的功能是将参数 buf 指定的缓冲区中的 count 个字节内容复制到硬件或内核
内存中,和 read() 一样,复制工作也需要由特殊函数来完成:

unsigned char_get_user_byte (char * u_addr) ;
unsigned char_get_user_word (short * u_addr) ;

unsigned char_get_user_long(long * u_addr) ;
unsigned memcpy_fromfs(void * k_addr ,void * u_addr ,unsigned long cnt) ;

  ioctl() 函数 该函数是特殊的控制函数,可以通过它向设备传递控制信息或从设备
取得状态信息,函数原型为:

int ioctl (struct inode * inode ,struct file * file ,unsigned int cmd ,unsigned long 
arg);

  参数 cmd 为设备驱动程序要执行的命令的代码,由用户自定义,参数 arg 为相应的
命令提供参数,类型可以是整型、指针等。

  同样,在驱动程序中,这些函数的定义也必须符合命名规则,按照本文约定,设备
“exampledev”的驱动程序的这些函数应分别命名为 exampledev_open、exampledev_ 
release、exampledev_read、exampledev_write、exampledev_ioctl,因此设备
“exampledev”的基本入口点结构变量 exampledev_fops 赋值如下:

struct file_operations exampledev_fops {

 NULL ,

 exampledev_read ,

 exampledev_write ,

 NULL ,

 NULL ,

 exampledev_ioctl ,

 NULL ,

 exampledev_open ,

 exampledev_release ,