太长了;博士
如果我希望我的模块遵循现代实践,我应该在 shell 脚本中/dev/
通过 via创建设备,还是直接在模块源代码中通过 via和C 函数创建设备?一种方法相对于另一种方法有哪些优点?mknod
class_create
device_create
详细
在第3章的Linux 设备驱动程序,第三版,第 45 页,如果设备编号已知,该函数register_chrdev_region
将作为用于注册字符设备的函数。
然而,由于今天未使用的设备号明天可能会被内核使用,因此几乎立即不鼓励使用此函数,第 46 页,支持alloc_chrdev_region
,它允许动态分配主设备号。
不过,在这一点上,作者指出,不能提前创建设备节点,/dev/
因为要创建它们,必须知道主设备号,而在alloc_chrdev_region
返回之前是不知道的。
所提出的解决方案是一个sh
ell 脚本,其中:
- 加载模块
insmod
,- 它调用模块的 init 函数,
- 这称为
alloc_chrdev_region
,- 这导致了一个新设备
/proc/devices
,
- 这导致了一个新设备
- 这称为
- 它调用模块的 init 函数,
- 用于
awk
从该设备中提取主设备号, - 最后将该主设备号传递给
mknod
创建设备文件/dev/
(次设备号编码在设备文件的名称中)。
然而,Linux 内核模块编程指南利用函数class_create
和device_create
,我相信来完成同样的任务。
让我感到紧张的是,尽管这本书 目前仍在更新中,它有一些方面使它比Linux 设备驱动程序,第三版。
例如,它使用register_chrdev
,尽管它建议更喜欢register_chrdev_region
或alloc_chrdev_region
,而 Linux 设备驱动程序,第三版通话时更加明确register_chrdev
老方法,将其解释缩减到仅占第 57 页的一半多。
另一方面,Linux 内核模块编程指南不是我发现的唯一使用class_create
Cdevice_create
函数而不是mknod
shell 函数来创建设备文件的来源。这里另一篇博文写于 2018 年初。
那么今天的事情该怎么做呢?