【问题标题】:Kernel modules and major numbers内核模块和主要编号
【发布时间】:2016-04-04 22:28:58
【问题描述】:

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

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

总结我的问题是:-

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

【问题讨论】:

    标签: linux linux-kernel ioctl


    【解决方案1】:
    1. 当我执行“echo 5 > /dev/mytestdevice”时,内核如何找到该设备对应的驱动程序?

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

    1. 为什么将主编号作为参数传递给 ioctl 调用?

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

    【讨论】:

      【解决方案2】:

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

      为什么你认为cmd 参数(第三个)必须在其中编码主要数字?任何特定驱动程序的 ioctl 命令集倾向于选择任意值并将其编码到其位中。这样就可以很容易地被其他工具解码。但该值不是(或不需要是)主编号。

      打开/有效的fd 用于路由基于文件的系统调用,例如readwriteioctl

      您可能需要查看 ioctl 文档,例如 Documentation/ioctl/ioctl-number.txtDocumentation/ioctl/ioctl-decoding.txt

      【讨论】:

        猜你喜欢
        • 2014-03-01
        • 2020-08-15
        • 1970-01-01
        • 2021-08-03
        • 2011-03-03
        • 2011-05-03
        • 2012-01-23
        • 2015-09-21
        • 1970-01-01
        相关资源
        最近更新 更多