如何在 Linux 2.6.29 的 ioctl 中解碼 cmd = 3222823425
我只是很困惑如何將
cmd=3222823425
值分解為不同的部分以弄清楚該命令在 Linux 核心中的實際含義。我知道,有些函式正在ioctl
使用以下參數發出命令,但我想知道這些參數值的含義。fd=21, cmd=3222823425 and arg=3203118816
我一直在查看各種論壇、手冊頁和其他連結,以弄清楚當系統呼叫
cmd
中的aioctl
值為3222823425
. 我發現 cmd 是一個由 組成的命令號,type
前number
兩個data_type
是8-bit
整數(0-255)。所以我的問題是如何解碼這些參數值以找出這個呼叫試圖做什麼?
ioctl 發送給驅動程序,因此要弄清楚 ioctl 正在做什麼,最重要的是哪個驅動程序正在處理它。
您所讀到的,
type
是驅動程序編寫者在選擇 ioctl 編號時應該使用的約定。儘管不同的驅動程序可以使用相同的值來表示完全不同的東西,但最好避免這種情況,這樣如果 ioctl 被意外發送到錯誤的設備,它很有可能會返回錯誤而不是導致一些災難性事件.number``data_type
《 Linux Device Drivers (LDD),第 6 章》一書中對約定進行了很好的描述。
data_type
實際上(自 2.6.x 系列 IIRC 早期的一段時間以來)由兩部分組成,direction
和size
.
type
(8 位)是一個常量,必須在驅動程序中實現的 ioctl 之間保持一致,並且如果可能,應該與不相關設備的 ioctl 不同。中有一個過時的type
值儲存庫Documentation/ioctl/ioctl-number.txt
。number
(8 位)對於驅動程序中的所有 ioctl 應該是不同的。direction
(2 位)指示數據傳輸的方向(0=無,1=寫,2=讀,3=兩者)。size
是數據緩衝區的大小,如果 ioctl 參數是指向數據緩衝區的指針。ioctl 編號應該是
direction << 30 | size << 16 | type << 8 | number
(如果您正在編寫驅動程序,請使用 中
_IOC_*
定義的宏asm-generic/ioctl.h
。)對於您的 ioctl 編號 3222823425 = 0xc0186201,我們得到 type=0x62(在 1999 年稱為“bit3 vme 主機橋”),number=1,direction=2 和 size=0x18=24,因此 ioctl 採用 24 字節的輸入參數.
這個 ioctl 值應該定義為
_IOR(0x62, 0x01, struct somestruct)
或類似的東西_IOR('b', 1, struct somestruct)
,其中struct somestruct
是一個 24 字節的結構。如果您不知道什麼驅動程序正在處理 ioctl,您可以在核心原始碼中搜尋這樣的呼叫來收集候選者。但是,請注意,簡單的文本搜尋通常不會找到驅動程序,因為它們通常使用宏,例如#define FOOIO_TYPE 0x62
後跟#define FOOIO_SOMETHING _IOR(FOOIO_TYPE, 1, struct foobar)
.除了 ioctl 作用的文件描述符之外,ioctl 呼叫還有兩個參數:ioctl number
cmd
和 argumentarg
。參數可以是立即數或指向緩衝區的指針。在這裡,如果驅動程序編寫器遵循約定,arg
則應該是指向應用程序記憶體空間中的 24 字節緩衝區的指針。