在計算中,ioctl 是對設備特定的輸入/輸出操作和其他不能用常規系統調用表達的操作的系統調用。 它需要一個指定請求代碼的參數; 調用的效果完全取決於請求代碼。 請求代碼通常是特定於設備的。

例如,可以指示物理設備彈出光盤的 CD-ROM 設備,則驅動程序將提供 ioctl 請求代碼來執行此操作。 與設備無關的請求代碼有時用於讓用戶空間訪問僅由核心系統軟件使用或仍在開發中的內核功能。 ioctl 系統調用以該名稱首次出現在 Unix 版本 7 中。 大多數 Unix 和類 Unix 系統都支持它,包括 LinuxmacOS,但可用的請求代碼因系統而異。Microsoft Windows 在其 Win32 API 中提供了一個類似的函數,名為「DeviceIoControl」。

背景

傳統的操作系統可以分為兩層,用戶空間內核文本編輯器等應用程序代碼駐留在用戶空間,而操作系統的底層設施(如網絡堆棧)駐留在內核中。 內核代碼處理敏感資源並實現應用程序之間的安全性和可靠性屏障; 因此,操作系統會阻止用戶模式應用程序直接訪問內核資源。 用戶空間應用程序通常通過系統調用向內核發出請求,其代碼位於內核層。

系統調用通常採用「系統調用向量」的形式,其中用索引號指示所需的系統調用。 例如,exit() 可能是 1 號系統調用,而 write() 號是 4。系統調用向量然後用於為請求找到所需的內核函數。 這樣,傳統的操作系統通常會向用戶空間提供數百個系統調用。

儘管系統調用是訪問標準內核設施的權宜之計,但系統調用有時不適用於訪問非標準硬件外圍設備。 必然地,大多數硬件外圍設備(也稱為設備)只能在內核中直接尋址。 但是用戶代碼可能需要直接與設備通信; 例如,管理員可能會在以太網接口上配置媒體類型。 現代操作系統支持多種設備,其中許多設備提供大量功能。 內核設計者可能沒有預見到其中一些設施,因此內核很難提供使用這些設備的系統調用。

為了解決這個問題,內核被設計成可擴展的,並且可以接受一個額外的模塊,稱為設備驅動程序,它運行在內核空間,可以直接尋址設備。 ioctl 接口是一個單一的系統調用,用戶空間可以通過它與設備驅動程序進行通信。 設備驅動程序上的請求根據此 ioctl 系統調用進行引導,通常通過設備句柄和請求編號進行引導。 因此,基本內核可以允許用戶空間訪問設備驅動程序,而無需了解設備支持的設施,也不需要難以管理的大量系統調用。

使用

硬件設備配置

ioctl 的一個常見用途是控制硬件設備。例如,在 Win32 系統上,ioctl 調用可以與 USB 設備通信,或者它們可以發現附加存儲設備的驅動器幾何信息。

OpenBSDNetBSD 上,bio(4) 偽設備驅動程序和 bioctl 實用程序使用 ioctl 在類似於 ifconfig 的統一供應商不可知接口中實現 RAID 卷管理。[1][2]在 NetBSD 上,ioctl 也被 sysmon 框架使用。[3]

終端

在面向最終用戶的應用程序中,ioctl 的一種用途是終端 I/O。 Unix 操作系統傳統上大量使用命令行界面。 Unix 命令行界面建立在偽終端 (ptys) 之上,它模擬硬件文本終端,例如 VT100s。 使用 ioctl 調用,可以像硬件設備一樣控制和配置 pty。 例如,pty 的窗口大小是使用 TIOCSWINSZ 調用設置的。TIOCSTI(terminal I/O control,模擬終端輸入)的ioctl函數可以將一個字符壓入設備流

參考文獻

  1. ^ Super User's BSD Cross Reference: /OpenBSD/share/man/man4/bio.4. bxr.su. [2023-01-09]. (原始內容存檔於2022-10-01). 
  2. ^ Super User's BSD Cross Reference: /OpenBSD/sbin/bioctl/bioctl.8. bxr.su. [2023-01-09]. (原始內容存檔於2023-01-09). 
  3. ^ sysmon(4) — system monitoring and power management interface. NetBSD. An ioctl(2) interface available via /dev/sysmon.