1. 程式人生 > >Linux內核中_IO,_IOR,_IOW,_IOWR宏的用法

Linux內核中_IO,_IOR,_IOW,_IOWR宏的用法

應用程序 round 判斷 fine 包含 區分 font 用法 原因

#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)

#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))

#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))

#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))

ioctl() 函數上傳送的變量 cmd 是應用程序用於區別設備驅動程序請求處理內容的值。cmd除了可區別數字外,還包含有助於處理的幾種相應信息。 cmd的大小為 32位,共分 4 個域:
bit31~bit30 2位為 “區別讀寫” 區,作用是區分是讀取命令還是寫入命令。
bit29~bit15 14位為 "數據大小" 區,表示 ioctl() 中的 arg 變量傳送的內存大小。
bit20~bit08 8位為 “魔數"(也稱為"幻數")區,這個值用以與其它設備驅動程序的 ioctl 命令進行區別。
bit07~bit00 8位為 "區別序號" 區,是區分命令的命令順序序號。

參數1:魔數 (magic number)
魔數範圍為 0~255 。通常,用英文字符 "A" ~ "Z" 或者 "a" ~ "z" 來表示。設備驅動程序從傳遞進來的命令獲取魔數,然後與自身處理的魔數想比較,如果相同則處理,不同則不處理。魔數是拒絕誤使用的初步輔助狀態。設備驅動 程序可以通過 _IOC_TYPE (cmd) 來獲取魔數。不同的設備驅動程序最好設置不同的魔數,但並不是要求絕對,也是可以使用其他設備驅動程序已用過的魔數。

參數2:基(序列號)數
基數用於區別各種命令。通常,從 0開始遞增,相同設備驅動程序上可以重復使用該值。例如,讀取和寫入命令中使用了相同的基數,設備驅動程序也能分辨出來,原因在於設備驅動程序區分命令時 使用 switch ,且直接使用命令變量 cmd值。創建命令的宏生成的值由多個域組合而成,所以即使是相同的基數,也會判斷為不同的命令。設備驅動程序想要從命令中獲取該基數,就使用下面的宏:
_IOC_NR (cmd)
通常,switch 中的 case 值使用的是命令的本身。

參數3:變量型
變量型使用 arg 變量指定傳送的數據大小,但是不直接代入輸入,而是代入變量或者是變量的類型,原因是在使用宏創建命令,已經包含了sizeof() 編譯命令。

在使用_IOR()、_IOW ()、_IOWR()時,ioctl() 的 arg 變量值指定設備驅動程序上寫入或讀取數據時的緩存 (結構體) 地址。即第三個參數是由ioctl()函數的第三個參數決定的,不需要用戶來填寫,只需要指定類型即可。

Linux內核中_IO,_IOR,_IOW,_IOWR宏的用法