內核驅動中的read()、write()函數使用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM