[英]ioctl vs kernel modules in Linux
我知道kernel模塊是用來寫device drivers
的。 您可以向 Linux kernel 添加新的system calls
,並使用它與其他設備進行通信。
我還讀到ioctl
是 linux 中使用的系統調用,用於實現默認情況下 kernel 中不可用的系統調用。
我的問題是,您為什么不為您的設備編寫一個新的kernel module
而不是使用ioctl
? 為什么ioctl
b 在 kernel 模塊存在的地方有用?
無論哪種情況,您都需要編寫 kernel 驅動程序,但您可以在添加新系統調用和添加 ioctl 之間進行選擇。
假設您要添加一項功能來獲取視頻捕獲設備的調諧器設置。
如果您將其實現為系統調用:
如果您將其實現為 ioctl:
由於 ioctl 更容易、更靈活,並且完全適用於所有這些驅動程序特定的 function 調用,因此這通常是首選方法。
我還讀到 ioctl 是 linux 中使用的系統調用,用於實現默認情況下 kernel 中不可用的系統調用。
系統調用(對於 Linux)在syscalls(2)中列出(在用戶空間和 kernel 土地之間有數百個), ioctl(2)就是其中之一。 另請閱讀有關 ioctl和Unix 哲學和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.