在 /dev/ 中创建设备文件的现代方法是什么?

在 /dev/ 中创建设备文件的现代方法是什么?

太长了;博士

如果我希望我的模块遵循现代实践,我应该在 shell 脚本中/dev/通过 via创建设备,还是直接在模块源代码中通过 via和C 函数创建设备?一种方法相对于另一种方法有哪些优点?mknodclass_createdevice_create

详细

第3章Linux 设备驱动程序,第三版,第 45 页,如果设备编号已知,该函数register_chrdev_region将作为用于注册字符设备的函数。

然而,由于今天未使用的设备号明天可能会被内核使用,因此几乎立即不鼓励使用此函数,第 46 页,支持alloc_chrdev_region,它允许动态分配主设备号。

不过,在这一点上,作者指出,不能提前创建设备节点,/dev/因为要创建它们,必须知道主设备号,而在alloc_chrdev_region返回之前是不知道的。

所提出的解决方案是一个shell 脚本,其中:

  • 加载模块insmod
    • 它调用模块的 init 函数,
      • 这称为alloc_chrdev_region,
        • 这导致了一个新设备/proc/devices
  • 用于awk从该设备中提取主设备号,
  • 最后将该主设备号传递给mknod创建设备文件/dev/(次设备号编码在设备文件的名称中)。

然而,Linux 内核模块编程指南利用函数class_createdevice_create我相信来完成同样的任务。

让我感到紧张的是,尽管这本书 目前仍在更新中,它有一些方面使它比Linux 设备驱动程序,第三版

例如,它使用register_chrdev,尽管它建议更喜欢register_chrdev_regionalloc_chrdev_region,而 Linux 设备驱动程序,第三版通话时更加明确register_chrdev 老方法,将其解释缩减到仅占第 57 页的一半多。

另一方面,Linux 内核模块编程指南不是我发现的唯一使用class_createCdevice_create函数而不是mknodshell 函数来创建设备文件的来源。这里另一篇博文写于 2018 年初。

那么今天的事情该怎么做呢?

相关内容