[英]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.