【问题标题】:Dynamic major number allocation - how to get it in ioctl application?动态主号码分配 - 如何在 ioctl 应用程序中获取它?
【发布时间】:2016-05-02 18:52:48
【问题描述】:

我想在注册内核模块时遵循最佳实践并为我的驱动程序使用动态主号码分配。

我可以用 printk 输出这个数字并用 dmesg 看到它。但是是否可以使用用于与驱动程序对话的 ioctl 应用程序检索这样的数字?

或者也许可以编写一些 shell 脚本来执行 insmod、mknod 并检索给定的主编号?

【问题讨论】:

    标签: linux-device-driver kernel-module ioctl


    【解决方案1】:

    通常通过读取 /proc/devices 我们可以获得动态分配的主要编号。

    awk '$2=="misc" {print $1}' /proc/devices
    

    这里的“misc”是驱动程序名称。

    编写一个返回主编号的额外函数没有害处。

    【讨论】:

      【解决方案2】:

      我假设您有一个静态的 /dev 目录,否则您可以让设备文件使用正确的主要和次要设备号动态创建并完成。

      如果您在/sys 上安装了 sysfs,您可以添加一个只读模块参数来指示注册到您的设备的主要设备号。 (如果您将驱动程序作为模块加载,您还可以在加载模块时使用相同的模块参数设置特定的主设备号,默认为动态分配的主设备号。要将这样的模块参数添加到驱动程序,您可以这样做:

      #define MYDRIVER_MAJOR_DEF 0  /* Default major is dynamic */
      
      unsigned int major = MYDRIVER_MAJOR_DEF;
      
      module_param(major, uint, 0444);
      MODULE_PARM_DESC(major,
                       "Major device number; set to 0 to assign dynamically;"
                       " (default="__MODULE_STRING(MYDRIVER_MAJOR_DEF)")");
      

      然后在使用register_chrdev 或其他方式注册您的设备时使用major 的值。注册设备后,如果major0,请将其设置为实际动态分配的主设备号,以便您可以通过 sysfs 模块参数文件读回它。

      从用户空间,模块参数文件将类似于/sys/module/mydriver/parameters/major,并将包含主要设备号作为十进制字符串。您可以在脚本中阅读它并将其与mknod 程序一起使用来创建设备文件。

      不过,使用动态 /dev 更容易!

      【讨论】:

      • 另外,要使用上面的方法在模块加载时分配一个固定的主设备号(假设你的驱动程序是一个可加载的内核模块),你可以使用类似modprobe mydriver major=240的东西。
      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2014-05-09
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 2017-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多