Linux 内核模块和主要编号

Linux 内核模块和主要编号,linux,linux-kernel,ioctl,Linux,Linux Kernel,Ioctl,我一直在阅读作为内核模块实现的驱动程序,对系统调用的CMD参数感到困惑。系统调用的CMD参数似乎编码了设备的主要编号和其他信息。为什么呢?这些信息是绝对必要的吗 假设我以“echo5>/dev/mytestdevice”的形式对设备执行写入操作。我没有指定主数字,因此我相信内核已经有了将设备与其内核模块相关联的方法。如果是这样,为什么我需要在对设备的ioctl调用中提供该信息(当我将fd作为第一个参数传递给设备时) 我的问题总结如下:- 当我执行“echo5>/dev/mytestdevice”

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

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

我的问题总结如下:-

  • 当我执行“echo5>/dev/mytestdevice”时,内核如何找到与该设备对应的驱动程序
  • 为什么主数字作为参数传递给ioctl调用

  • 我假设您在这里只讨论
    ioctl
    系统调用。请记住,还有更多的系统调用,其中许多根本不在设备上运行

    为什么您认为
    cmd
    参数(第三个)中必须编码主数字?任何特定驱动程序的ioctl命令集都倾向于选择任意值并将其编码为位。这是为了便于其他工具对其进行解码。但该值不是(或不要求是)主数字

    open/valid
    fd
    用于路由基于文件的系统调用,如
    read
    write
    ioctl


    您可能想查看像和这样的ioctl文档。

    我假设您在这里只讨论
    ioctl
    系统调用。请记住,还有更多的系统调用,其中许多根本不在设备上运行

    为什么您认为
    cmd
    参数(第三个)中必须编码主数字?任何特定驱动程序的ioctl命令集都倾向于选择任意值并将其编码为位。这是为了便于其他工具对其进行解码。但该值不是(或不要求是)主数字

    open/valid
    fd
    用于路由基于文件的系统调用,如
    read
    write
    ioctl

    您可能希望查看像和这样的ioctl文档

  • 当我执行“echo5>/dev/mytestdevice”时,内核如何找到与该设备对应的驱动程序
  • Inode对于设备文件
    /dev/mytestdevice
    是一个特殊的:它不与某些文件的内容相关联,只包含主数字和次数字。当您试图对这样的文件执行某些操作时,内核首先使用这些标识符搜索已注册的设备,然后为找到的设备重定向操作

  • 为什么主数字作为参数传递给ioctl调用
  • 它不是真的:
    cmd
    调用的
    ioctl
    参数不包含主数字

  • 当我执行“echo5>/dev/mytestdevice”时,内核如何找到与该设备对应的驱动程序
  • Inode对于设备文件
    /dev/mytestdevice
    是一个特殊的:它不与某些文件的内容相关联,只包含主数字和次数字。当您试图对这样的文件执行某些操作时,内核首先使用这些标识符搜索已注册的设备,然后为找到的设备重定向操作

  • 为什么主数字作为参数传递给ioctl调用
  • 它不是真的:
    cmd
    调用的
    ioctl
    参数不包含主数字