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 ,