簡體   English   中英

這個宏_IOR(MY_MACIG,0,int)是什么意思?

[英]what is the meaning of this macro _IOR(MY_MACIG, 0, int)?

我正在通過ioctl示例程序來檢查它與內核空間的通信方式。 在程序中WRITE_IOCTL用作命令

#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)
ioctl(fd, WRITE_IOCTL, "hello world")

我無法理解什么是_IOW(MY_MACIG, 1, int) 這是我下載程序的鏈接。 請幫我。 http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-4.html

您可能知道,ioctl應該是唯一的,如Linux設備驅動程序書中所述:

ioctl命令編號在整個系統中應該是唯一的,以防止由於向錯誤的設備發出正確的命令而導致的錯誤。這種不匹配不太可能發生,程序可能會發現自己試圖改變非波特率。串行端口輸入流,例如FIFO或音頻設備。 如果每個ioctl編號都是唯一的,則應用程序會收到EINVAL錯誤,而不是成功執行無意識的操作。

此外,ioctl可能需要將數據寫入內核空間和/或從內核空間讀取數據。

當一個人創建自己的執行ioctl的驅動程序時,他需要在ioctl命令中描述所有這些。

_IO,_IOW,_IOR,_IORW是輔助宏,用於創建唯一的ioctl標識符並添加所需的R / W所需功能(方向)。

這些可以采用以下參數:幻數,命令ID和將傳遞的數據類型(如果有)

幻數是一個唯一的數字,允許驅動程序檢測錯誤,例如LDD書中引用的錯誤。

命令id是您的驅動程序了解需要調用哪個命令的一種方法。

最后一個參數(類型)將允許內核理解要復制的大小。

希望這可以幫助。

PS:您可以在Linux設備驅動程序一書中獲得更多詳細信息(第6章) https://lwn.net/images/pdf/LDD3/ch06.pdf

來自http://www.circlemud.org/jelson/software/fusd/docs/node31.html

Linux頭文件/usr/include/asm/ioctl.h定義了必須用於創建ioctl命令編號的宏。 這些宏采用三種參數的各種組合:

  • type ,一個8位整數,選擇特定於設備驅動程序。 應該選擇類型,以免與可能“監聽”同一文件描述符的其他驅動程序沖突。 (例如,在內核中,TCP和IP堆棧使用不同的數字,因為發送到套接字文件描述符的ioctl可能會被兩個堆棧檢查。)
  • number ,一個8位整數命令號。 在驅動程序中,應為驅動程序服務的每種不同類型的ioctl命令選擇不同的數字
  • data_type ,用於計算客戶端與驅動程序之間交換的字節數的類型名稱。 例如,該參數是結構的名稱。

用於生成命令編號的宏是:

  • _IO(int type,int number) ,用於一個只發送類型和數字的簡單ioctl,只接收一個(整數)retval
  • _IOR(int type,int number,data_type) ,用於從設備驅動程序讀取數據的ioctl。 將允許驅動程序將sizeof(data_type)字節返回給用戶
  • _IOW(int type,int number,data_type) ,類似於_IOR,但用於將數據寫入驅動程序
  • _IORW(int type,int number,data_type) ,_IOR和_IOW的組合。 也就是說,數據都寫入驅動程序,然后由客戶端從驅動程序讀回

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM