繁体   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