Linux 内核模块和主要编号
我一直在阅读作为内核模块实现的驱动程序,对系统调用的CMD参数感到困惑。系统调用的CMD参数似乎编码了设备的主要编号和其他信息。为什么呢?这些信息是绝对必要的吗 假设我以“echo5>/dev/mytestdevice”的形式对设备执行写入操作。我没有指定主数字,因此我相信内核已经有了将设备与其内核模块相关联的方法。如果是这样,为什么我需要在对设备的ioctl调用中提供该信息(当我将Linux 内核模块和主要编号,linux,linux-kernel,ioctl,Linux,Linux Kernel,Ioctl,我一直在阅读作为内核模块实现的驱动程序,对系统调用的CMD参数感到困惑。系统调用的CMD参数似乎编码了设备的主要编号和其他信息。为什么呢?这些信息是绝对必要的吗 假设我以“echo5>/dev/mytestdevice”的形式对设备执行写入操作。我没有指定主数字,因此我相信内核已经有了将设备与其内核模块相关联的方法。如果是这样,为什么我需要在对设备的ioctl调用中提供该信息(当我将fd作为第一个参数传递给设备时) 我的问题总结如下:- 当我执行“echo5>/dev/mytestdevice”
fd
作为第一个参数传递给设备时)
我的问题总结如下:-
我假设您在这里只讨论
ioctl
系统调用。请记住,还有更多的系统调用,其中许多根本不在设备上运行
为什么您认为cmd
参数(第三个)中必须编码主数字?任何特定驱动程序的ioctl命令集都倾向于选择任意值并将其编码为位。这是为了便于其他工具对其进行解码。但该值不是(或不要求是)主数字
open/validfd
用于路由基于文件的系统调用,如read
和write
和ioctl
您可能想查看像和这样的ioctl文档。我假设您在这里只讨论
ioctl
系统调用。请记住,还有更多的系统调用,其中许多根本不在设备上运行
为什么您认为cmd
参数(第三个)中必须编码主数字?任何特定驱动程序的ioctl命令集都倾向于选择任意值并将其编码为位。这是为了便于其他工具对其进行解码。但该值不是(或不要求是)主数字
open/validfd
用于路由基于文件的系统调用,如read
和write
和ioctl
您可能希望查看像和这样的ioctl文档
/dev/mytestdevice
是一个特殊的:它不与某些文件的内容相关联,只包含主数字和次数字。当您试图对这样的文件执行某些操作时,内核首先使用这些标识符搜索已注册的设备,然后为找到的设备重定向操作
cmd
调用的ioctl
参数不包含主数字
/dev/mytestdevice
是一个特殊的:它不与某些文件的内容相关联,只包含主数字和次数字。当您试图对这样的文件执行某些操作时,内核首先使用这些标识符搜索已注册的设备,然后为找到的设备重定向操作
cmd
调用的ioctl
参数不包含主数字