我有一个自定义内核模块(在 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.
但如果您想让用户更方便,可以采取两种方法:
您可以修改驱动程序代码来创建设备节点:如果您的字段非零,则
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); }
因为只有当您选择静态主要/次要时这才有效,所以它可能不是最好的前进方式,但所有文档都非常频繁地提到这些“静态设备节点”,所以也许仍然有一些空间用于制作静态设备节点。
您可以为您的设备提供 udev 规则;Daniel Drake 写了一个很好的教程您可能会发现比
udev(7)
官方文档更有启发性。
答案2
您可以首先将其放入robsio
或/etc/modules
发行版中查找要在启动时加载的模块(通常在自动检测之后)。它可能/etc/modules.d/_____
在您的系统上。
之后,请求过程条目可能是您在模块代码中执行的操作,但这超出了我的专业领域,因此我将其留给专家。