生活随笔
收集整理的這篇文章主要介紹了
字符设备的读写
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在應用程序看來,字符設備只是一個設備文件,應用程序可以像操作普通文件一樣對硬件設備進行操作。應用層對設備的操作都在設備驅動程序的file_operations結構中有對應的接口,比如應用層的read函數對應驅動層的file_operations-> read,而應用層的write函數對應驅動層的file_operations-> write。本節介紹字符設備內核空間與用戶空間數據交互的方法。
先看file_operations中的讀寫接口:
ssize_t?(*read)?(struct?file?*,?char?__user?*,?size_t,?loff_t?*); ?ssize_t?(*write)?(struct?file?*,?const?char?__user?*,?size_t,?loff_t?*);?
它們的第二個參數實際上是用戶空間的數據地址。由于內核態和用戶態使用不同的內存定義,所以二者之間不能直接訪問對方的內存,而應該使用Linux中的用戶和內核態內存交互函數,這些函數在include/asm/uaccess.h中聲明。
從內核空間復制數據到用戶空間使用copy_to_user函數:
unsigned?long?copy_to_user?(void?__user?*?to,?const?void?*?from,?unsigned?long?n);?
而要從用戶空間復制數據到內核空間可以用copy_from_user函數:
unsigned?long?copy_from_user?(void?*?to,?const?void*?from,?unsigned?long?n);?
此外內核空間和用戶空間之間也可進行單值交互(如char、int、long類型):
int??put_user(dataum,ptr);??//向用戶空間傳單值 ?int??get_user(local,ptr);???//向內核空間傳單值?
當一個指針指向用戶空間時,必須確保指向的用戶地址是合法的,而且對應的頁面也已經映射,這一點可以使用access_ok函數檢測。access_ok函數的type參數有兩個選項:VERIFY_READ、VERIFY_ WRITE,分別對應內存讀、寫。
int?access_ok(int?type,?const?void?*addr,?unsigned?long?size);?
在訪問用戶空間的內存時,可以使用下面的方法先檢查用戶空間的指針是否合法:
char?kernelbuffer[100]; ?static?ssize_t?demo_read(struct?file?*file,?char?__user?*buffer,?size_t?count,?loff_t?*ppos) ?{ ?????if?(!access_ok(VERIFY_WRITE,?buffer,?count)) ?????????return?-EFAULT; ?????if?(copy_to_user(buffer,?kernelbuffer,?count)) ?????????????return?-EFAULT; ?????return?count; ?} ?
總結
以上是生活随笔為你收集整理的字符设备的读写的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。