Linux

如何在 Linux 2.6.29 的 ioctl 中解碼 cmd = 3222823425

  • January 9, 2013

我只是很困惑如何將cmd=3222823425值分解為不同的部分以弄清楚該命令在 Linux 核心中的實際含義。我知道,有些函式正在ioctl使用以下參數發出命令,但我想知道這些參數值的含義。

fd=21, cmd=3222823425 and arg=3203118816 

我一直在查看各種論壇、手冊頁和其他連結,以弄清楚當系統呼叫cmd中的aioctl值為3222823425. 我發現 cmd 是一個由 組成的命令號,typenumber兩個data_type8-bit整數(0-255)。

所以我的問題是如何解碼這些參數值以找出這個呼叫試圖做什麼?

ioctl 發送給驅動程序,因此要弄清楚 ioctl 正在做什麼,最重要的是哪個驅動程序正在處理它。

您所讀到的,type是驅動程序編寫者在選擇 ioctl 編號時應該使用的約定。儘管不同的驅動程序可以使用相同的值來表示完全不同的東西,但最好避免這種情況,這樣如果 ioctl 被意外發送到錯誤的設備,它很有可能會返回錯誤而不是導致一些災難性事件.number``data_type

《 Linux Device Drivers (LDD),第 6 章》一書中對約定進行了很好的描述。data_type實際上(自 2.6.x 系列 IIRC 早期的一段時間以來)由兩部分組成,directionsize.

  • 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 numbercmd和 argument arg。參數可以是立即數或指向緩衝區的指針。在這裡,如果驅動程序編寫器遵循約定,arg則應該是指向應用程序記憶體空間中的 24 字節緩衝區的指針。

引用自:https://unix.stackexchange.com/questions/60620