目前,我正在学习Linux设备驱动程序,我觉得自己对设备如何在Linux中实例化产生了根本性的误解。
在Linux模块中,我可以调用alloc_chrdev_region()向内核注册设备。具体来说,这个函数是
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,
unsigned int count, char *name);
它生成设备编号(主要/次要)并接受设备名称。
成功执行后,将在/proc/devices中创建一个主要编号和设备类型名称的条目。但是,/dev中没有生成任何设备文件。相反,我必须发出一个mknod调
我正在为Linux内核编写一个模块,我想在init()函数中创建一些设备节点:
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
// Now I want to create device nodes
// with the returned major number
}
我还希望内核为我的第一个节点分配一个次要编号,然后我将自己分配其他节点的次要编号。
我如何在代码中做到这一点?我不想使用从shell创建设备。
在2017“UNIX和Linux系统管理”一书中,我阅读了以下文章:
现代系统自动管理他们的设备文件。然而,一些罕见的角落情况可能仍然需要您使用mknod命令手动创建设备。以下是如何做到这一点:
mknod filename type major minor
在这里,文件名是要创建的设备文件,字符设备的类型是c,块设备的是b,主和次要的设备编号。如果您正在创建一个引用内核中已经存在的驱动程序的设备文件,将检查驱动程序的文档,以找到适当的主设备号和次要设备号。
我在哪里可以找到这个文档,以及如何找到设备驱动程序的大副命令?
我需要处理两个自定义硬件,它们都通过两个串行连接发送调试数据。这些串行连接通过两个串行到USB转换器。串行到USB的设备具有相同的供应商编号、设备编号,显然还有相同的序列号。
问题是:我想分别记录这两个串行端口。自定义硬件需要不断地重新启动,并且它们是否连接到相同的/dev/ttyUSB*是完全随机的。我如何让他们每次都选择相同的设备路径?我可以让它依赖于它所插入的端口,但这似乎有点老生常谈。
因此,我对udevadm的输出进行了比较,如下所示:
$ udevadm info -a -p `udevadm info -q path -n /dev/ttyUSB1` > usb1
$ ud
我刚刚开始在linux上使用ZFS,并且已经遇到了问题。
我将旧数据驱动器连接到服务器,以便将数据复制到新的ZFS卷。但是,当我删除这个驱动器并重新启动Linux时,我发现我的设备已经重新编号,ZFS不能再挂载它的池了。
锌池状态
pool: media
state: UNAVAIL
status: One or more devices could not be opened. There are insufficient
replicas for the pool to continue functioning.
action: Attach the missing