内核模块和主要编号
Kernel modules and major numbers
我一直在阅读作为内核模块实现的驱动程序,并且对系统调用的 CMD 参数感到困惑。系统调用的 CMD 参数似乎在其他信息中编码了设备的主要编号。这是为什么?此信息绝对必要吗?
假设我以 "echo 5 > /dev/mytestdevice" 的身份对我的设备执行写入操作。我没有指定主要编号,因此我相信内核已经有办法将设备与其内核模块相关联。如果是这样,为什么我需要在对设备的 ioctl 调用中提供该信息(因为我将 fd
作为第一个参数传递给设备)?
总结一下我的问题是:-
- 当我执行 "echo 5 > /dev/mytestdevice" 时,内核如何找到与该设备对应的驱动程序?
- 为什么主编号作为参数传递给 ioctl 调用?
我假设您在这里只谈论 ioctl
系统调用。请记住,还有更多的系统调用,其中许多根本不在设备上运行。
为什么您认为 cmd
参数(第三个)必须在其中编码主编号?任何特定驱动程序的 ioctl 命令集往往会选择一个任意值并将其编码在其位中。这样它就可以很容易地被其他工具解码。但该值不是(或不需要是)主要数字。
open/valid fd
用于路由基于文件的系统调用,例如 read
和 write
以及 ioctl
.
您可能想查看 ioctl 文档,例如 Documentation/ioctl/ioctl-number.txt and Documentation/ioctl/ioctl-decoding.txt。
- When I do a "echo 5 > /dev/mytestdevice", how does the kernel find the driver corresponding to that device?
设备文件 /dev/mytestdevice
的 Inode 是一个特殊点:它不与某些文件的内容关联,它只是 包含主要和次要编号。当您尝试对此类文件执行某些操作时,内核首先使用这些标识符搜索已注册的设备,然后将操作重定向到找到的设备。
- Why is the major number passed as an argument to an ioctl call?
这不是真的:ioctl
调用的 cmd
参数不包含主号码。
我一直在阅读作为内核模块实现的驱动程序,并且对系统调用的 CMD 参数感到困惑。系统调用的 CMD 参数似乎在其他信息中编码了设备的主要编号。这是为什么?此信息绝对必要吗?
假设我以 "echo 5 > /dev/mytestdevice" 的身份对我的设备执行写入操作。我没有指定主要编号,因此我相信内核已经有办法将设备与其内核模块相关联。如果是这样,为什么我需要在对设备的 ioctl 调用中提供该信息(因为我将 fd
作为第一个参数传递给设备)?
总结一下我的问题是:-
- 当我执行 "echo 5 > /dev/mytestdevice" 时,内核如何找到与该设备对应的驱动程序?
- 为什么主编号作为参数传递给 ioctl 调用?
我假设您在这里只谈论 ioctl
系统调用。请记住,还有更多的系统调用,其中许多根本不在设备上运行。
为什么您认为 cmd
参数(第三个)必须在其中编码主编号?任何特定驱动程序的 ioctl 命令集往往会选择一个任意值并将其编码在其位中。这样它就可以很容易地被其他工具解码。但该值不是(或不需要是)主要数字。
open/valid fd
用于路由基于文件的系统调用,例如 read
和 write
以及 ioctl
.
您可能想查看 ioctl 文档,例如 Documentation/ioctl/ioctl-number.txt and Documentation/ioctl/ioctl-decoding.txt。
- When I do a "echo 5 > /dev/mytestdevice", how does the kernel find the driver corresponding to that device?
设备文件 /dev/mytestdevice
的 Inode 是一个特殊点:它不与某些文件的内容关联,它只是 包含主要和次要编号。当您尝试对此类文件执行某些操作时,内核首先使用这些标识符搜索已注册的设备,然后将操作重定向到找到的设备。
- Why is the major number passed as an argument to an ioctl call?
这不是真的:ioctl
调用的 cmd
参数不包含主号码。