linux - 内核模块和主要编号

标签 linux linux-kernel ioctl

我一直在阅读作为内核模块实现的驱动程序,并对系统调用的 CMD 参数感到困惑。系统调用的 CMD 参数似乎在其他信息中编码了设备的主要编号。这是为什么?此信息绝对必要吗?

假设我以“echo 5 >/dev/mytestdevice”的形式对我的设备执行写入操作。我没有指定主要编号,因此我相信内核已经有办法将设备与其内核模块相关联。如果是这样,为什么我需要在对设备的 ioctl 调用中提供该信息(因为我将 fd 作为第一个参数传递给设备)?

总结我的问题是:-

  1. 当我执行“echo 5 >/dev/mytestdevice”时,内核如何找到与该设备对应的驱动程序?
  2. 为什么要将主要编号作为参数传递给 ioctl 调用?

最佳答案

  1. When I do a "echo 5 > /dev/mytestdevice", how does the kernel find the driver corresponding to that device?
设备文件的

Inode /dev/mytestdevice是一个特殊点:它不是与某些文件的内容相关联,而是包含主要和次要编号。当您尝试对此类文件执行某些操作时,内核首先使用这些标识符搜索已注册的设备,然后为找到的设备重定向操作。

  1. Why is the major number passed as an argument to an ioctl call?

这不是真的:cmd ioctl 的参数调用不包含主号码。

关于linux - 内核模块和主要编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36414040/

相关文章:

linux - 没有得到 scsi 的主机、id、 channel 号

networking - 将SKB推送到网络堆栈

linux - 内核模块应该在 Linux 上使用什么错误代码?

linux-kernel - 我的中断处理程序应该禁用中断还是 ARM 处理器自动执行此操作?

windows - SIO_FLUSH 的行为

c - select 中可以使用相同的 fd 进行读写

c - 打开文件实际上是做什么的?

c - Linux 中 WaitForSingleObject() 和 ResetEvent() 的等效性

linux - 与子shell命令交互时如何使ctrl + c取消整个命令?

rust - 如何使用 ioctl + nix 宏获取可变大小的缓冲区