read()、write() 函数
a -- read() 函数
函数原型ssize_t (*read) (struct file * filp, char __user * buffer, size_t size , loff_t * p);
参数含义
filp :为进行读取信息的目标文件,
buffer :为对应放置信息的缓冲区(即用户空间内存地址);
size :为要读取的信息长度;
p :为读的位置相对于文件开头的偏移,在读取信息后,这个指针一般都会移动,移动的值为要读取信息的长度值
b -- write() 函数
函数原型ssize_t (*write) (struct file * filp, const char __user *buffer, size_t count, loff_t *ppos);
参数含义
filp :为目标文件结构体指针;
buffer :为要写入文件的信息缓冲区;
count :为要写入信息的长度;
Ppos :为当前的偏移位置,这个值通常是用来判断写文件是否越界
两个函数的作用分别是 从设备中获取数据及发送数据给设备,应用程序中与之对应的也有 write() 函数及 read() 函数:
len = read(fd,buf,len )
len = write(fd,buf,size)
static ssize_t hello_read(struct file *filep, char __user *buf, size_t len, loff_t *pos)
static ssize_t hello_write(struct file *filep, const char __user *buf, size_t len, loff_t *pos)
我们知道,应用程序工作在用户空间,而驱动工作在内核空间,二者不能直接通信的,那我们用何种方法进行通信呢?下面介绍一下内核中的memcpy---copy_from_user和copy_to_user,虽然说内核中不能使用C库提供的函数,但是内核也有一个memcpy的函数,用法跟C库中的一样。
copy_to_user(void __user * to,const void * from,unsigned long n);
相对于内核而言,把内核中的数据传给应用程序,from内核中数据to用户,长度为n,用在驱动中的read函数中。
copy_from_user(void * to,const void __user * from,unsigned long n);
相对于内核而言,把应用中的数据传给内核驱动,from用户中数据to内核,长度为n,用在驱动中的write函数中。