字符设备的读写
在應(yīng)用程序看來,字符設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。應(yīng)用層對(duì)設(shè)備的操作都在設(shè)備驅(qū)動(dòng)程序的file_operations結(jié)構(gòu)中有對(duì)應(yīng)的接口,比如應(yīng)用層的read函數(shù)對(duì)應(yīng)驅(qū)動(dòng)層的file_operations-> read,而應(yīng)用層的write函數(shù)對(duì)應(yīng)驅(qū)動(dòng)層的file_operations-> write。本節(jié)介紹字符設(shè)備內(nèi)核空間與用戶空間數(shù)據(jù)交互的方法。
先看file_operations中的讀寫接口:
它們的第二個(gè)參數(shù)實(shí)際上是用戶空間的數(shù)據(jù)地址。由于內(nèi)核態(tài)和用戶態(tài)使用不同的內(nèi)存定義,所以二者之間不能直接訪問對(duì)方的內(nèi)存,而應(yīng)該使用Linux中的用戶和內(nèi)核態(tài)內(nèi)存交互函數(shù),這些函數(shù)在include/asm/uaccess.h中聲明。
從內(nèi)核空間復(fù)制數(shù)據(jù)到用戶空間使用copy_to_user函數(shù):
而要從用戶空間復(fù)制數(shù)據(jù)到內(nèi)核空間可以用copy_from_user函數(shù):
此外內(nèi)核空間和用戶空間之間也可進(jìn)行單值交互(如char、int、long類型):
當(dāng)一個(gè)指針指向用戶空間時(shí),必須確保指向的用戶地址是合法的,而且對(duì)應(yīng)的頁面也已經(jīng)映射,這一點(diǎn)可以使用access_ok函數(shù)檢測。access_ok函數(shù)的type參數(shù)有兩個(gè)選項(xiàng):VERIFY_READ、VERIFY_ WRITE,分別對(duì)應(yīng)內(nèi)存讀、寫。
在訪問用戶空間的內(nèi)存時(shí),可以使用下面的方法先檢查用戶空間的指針是否合法:
總結(jié)
- 上一篇: 使用cdev_add注册字符设备
- 下一篇: seek接口