簡體   English   中英

Linux 中的 ioctl 與 kernel 模塊

[英]ioctl vs kernel modules in Linux

我知道kernel模塊是用來寫device drivers的。 您可以向 Linux kernel 添加新的system calls ,並使用它與其他設備進行通信。

我還讀到ioctl是 linux 中使用的系統調用,用於實現默認情況下 kernel 中不可用的系統調用。

我的問題是,您為什么不為您的設備編寫一個新的kernel module而不是使用ioctl 為什么ioctl b 在 kernel 模塊存在的地方有用?

無論哪種情況,您都需要編寫 kernel 驅動程序,但您可以在添加新系統調用和添加 ioctl 之間進行選擇。

假設您要添加一項功能來獲取視頻捕獲設備的調諧器設置。

如果您將其實現為系統調用:

  • 你不能只加載一個模塊,你需要改變 kernel 本身
  • 數百個驅動程序每個都可以添加數十個系統調用,將表中包含數千個必須永久保存的全局函數。
  • 為了使驅動程序有任何范圍,您需要說服 kernel 維護人員,這個負擔是值得的。
  • 您需要將定義上游化到 glibc 中,人們必須先升級才能為其編寫程序

如果您將其實現為 ioctl:

  • 您可以為現有的 kernel 構建模塊並讓用戶加載它,而無需讓 kernel 維護人員參與
  • 所有函數都是適用的 header 文件中的每個驅動程序的簡單常量,可以在其中輕松添加或刪除它們
  • 只需包含 header,每個人都可以開始使用它進行編程

由於 ioctl 更容易、更靈活,並且完全適用於所有這些驅動程序特定的 function 調用,因此這通常是首選方法。

我還讀到 ioctl 是 linux 中使用的系統調用,用於實現默認情況下 kernel 中不可用的系統調用。

這是不正確的。

系統調用(對於 Linux)在syscalls(2)中列出(在用戶空間和 kernel 土地之間有數百個), ioctl(2)就是其中之一。 另請閱讀有關 ioctlUnix 哲學Linux 匯編程序方法的維基頁面

實際上, ioctl主要用於設備文件,並且用於不是讀取(2)寫入(2)字節的內容。 例如,通過向/dev/audio寫入字節來發出聲音,但要更改音量,您將使用一些ioctl 另請參閱fcntl(2)發揮類似作用。

輸入/輸出也可能通過mmap(2)和相關的虛擬地址空間系統調用發生(以某種方式間接......)。

更多信息,請閱讀 高級 Linux 編程操作系統:三個簡單的部分。 查看Osdev以獲取有關編寫自己的操作系統的更多提示。

一個 kernel 模塊可以實現新的設備,或者新的ioctl等……更多信息請參見kernelnewbies 我傾向於相信它有時可能會添加一些新的系統調用(但這在舊的 linux內核(如 3.x 內核)中是錯誤的)

Linux 大部分是開源的。 請下載然后查看源代碼。 另請參閱Linux 從零開始

IIRC,Linux kernel 1.0 沒有任何 kernel 模塊。 但那是在 1995 年左右。

暫無
暫無

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

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