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函數中。