萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> Linux--Linux內核模塊編程之和設備文件對話在線閱讀

Linux--Linux內核模塊編程之和設備文件對話在線閱讀

 和設備文件對話(寫和 IOCTL)
  設備文件應該表現物理設備。大多物理設備既作為輸出也作為輸入,因此必須有某個機制使內核中的設備驅動程序得到來自進程的輸出以便發送到設備。通過為輸出打開設備文件並向其寫而做到這個,就像寫一個普通文件。在下面的例子中,這是用 device_write 實現的。
  這不總是足夠的。想象你有一個串行口連接到一個調制解調器(即使你有一個內置的調制解調器,從CPU的觀點看它仍然是通過串行口連接到調制解調器,因此你不必責備你的想象力)。自然而然的事情是使用設備文件向調制解調器寫(要麼是調制解調器命令,要麼是要通過電話線發送的數據)和從中讀(要麼是命令回應,要麼是接收的數據)。然而,這留下了當你需要和串行口對話時該做什麼的問題,例如以什麼速率接收和發送數據。
  在 Unix 中,答案是使用特殊的函數調用 ioctl ( input output control 的縮寫)。每個設備可以有自己的 ioctl 命令,它可以讀 ioctl (從進程向內核發送信息)和寫 ioctl(返回信息給進程)(注意在這兒讀寫的作用又是顛倒的,因此ioctl 的讀是發送消息給內核而寫是從內核接收消息)或者什麼也不做。 ioctl 使用三個參數調用: 合適的設備文件的文件描述符, ioctl 號及一個參數,該參數是類型長度,因此你可以使用一個模型傳遞任何東西。 (這是不准確的。例如你不能通過ioctl傳遞一個結構 -- 但你可以傳遞那個結構的指針)
  ioctl 號用主設備號, ioctl 類型,命令和參數類型編碼。這個 ioctl 號通常用一個頭文件中的宏調用 (_IO, _IOR, _IOW 或 _IOWR -- 取決於類型)創建。頭文件必須被使用ioctl的程序(因此它們可以生成合適的ioctl)及內核模塊(因此它可以理解它) #include。 在下面的范例中,頭文件是 chardev.h 而使用它的程序是 ioctl.c。
  如果你想在你自己的模塊中使用 ioctl ,最好接受官方的 ioctl 分配,因此如果你碰巧得到別人的ioctl或它們得到你的,你就可以知道某些事是錯的。需要更多信息,請參考 `Documentation/ioctl-number.txt' 內核源代碼樹。


copyright © 萬盛學電腦網 all rights reserved