archlinux 中的 mknod 永久命令

archlinux 中的 mknod 永久命令

我有一个自定义内核模块(在 ArchLinux 上),我可以手动加载它并与之交互。我想做的是在启动时加载它。到目前为止,我已经设法让设备在/proc/devices启动时出现。

如何在启动时用它制作一个节点是困扰我的问题。看过udev大多数使用 USB 驱动器作为指南的示例后,我的情况并非如此。实际设备是定制的 IO 卡。它是一个字符设备。

下面是从 shell 加载设备的脚本(有效):

#!/bin/sh
sudo insmod ./robsio.ko
DEV=`cat /proc/devices | grep robsio | awk '{print $1}'`
sudo mknod /dev/proc/robsio c $DEV 0

答案1

您创建的任何设备节点都将在系统启动时/lib/udev/devices复制到其中:/dev/

DESCRIPTION
   udevd listens to kernel uevents. For every event, udevd
   executes matching instructions specified in udev rules. See
   udev(7).

   On startup the content of the directory /lib/udev/devices is
   copied to /dev. If kernel modules specify static device
   nodes, these nodes are created even wihtout a corresponding
   kernel device, to allow on-demand loading of kernel modules.
   Matching permissions specified in udev rules are applied to
   these static device nodes.

但如果您想让用户更方便,可以采取两种方法:

  1. 您可以修改驱动程序代码来创建设备节点:如果您的字段非零,则drivers/base/core.c::device_add(struct device *dev)允许您创建设备节点:struct device devt

        if (MAJOR(dev->devt)) {
            error = device_create_file(dev, &devt_attr);
            if (error)
                goto ueventattrError;
    
            error = device_create_sys_dev_entry(dev);
            if (error)
                goto devtattrError;
    
            devtmpfs_create_node(dev);
        }
    

    因为只有当您选择静态主要/次要时这才有效,所以它可能不是最好的前进方式,但所有文档都非常频繁地提到这些“静态设备节点”,所以也许仍然有一些空间用于制作静态设备节点。

  2. 您可以为您的设备提供 udev 规则;Daniel Drake 写了一个很好的教程您可能会发现比udev(7)官方文档更有启发性。

答案2

您可以首先将其放入robsio/etc/modules发行版中查找要在启动时加载的模块(通常在自动检测之后)。它可能/etc/modules.d/_____在您的系统上。

之后,请求过程条目可能是您在模块代码中执行的操作,但这超出了我的专业领域,因此我将其留给专家。

相关内容