伪设备是否在内核中实现为设备驱动程序?



我有点想知道像/dev/null 和/dev/zero 这样的 pseduo-device 是否在内核中作为设备驱动程序实现。我敢肯定他们是,但不是100%确定。/dev/null 和/dev/zero 设备文件具有相同的主编号,但次要编号不同;它们使用相同的驱动程序,该驱动程序并不真正驱动物理硬件和次要编号来指定驱动程序中的不同功能。

我的假设正确吗?

至少在经典上,所有设备(无论是否伪(都是在内核中作为设备驱动程序实现的。通常,伪设备的支持函数实现很少。/dev/null的编写代码没有成功(/dev/zero可能也是如此(;/dev/null的读取代码报告"无数据";/dev/zero的读取代码将给定的缓冲区清零。等等。在过去的20年里,情况可能发生了一些变化,但或多或少是过去的样子,也是我期望它仍然如此(但我活着感到惊讶(。

在我使用的Linux系统上,也许在其他Linux系统上,/dev/null/dev/zero/dev/random都有相同的主编号。

这不一定是问题。 它们具有不同的次要编号,因此可以并且确实彼此执行不同的事情,就像不同的磁盘驱动器可能共享一个主要编号一样,但次要编号区分主设备的不同子部分,甚至完全区分不同的驱动器。

在 Mac(运行 macOS Sierra 10.12.5(上,/dev/null/dev/zero共享相同的主编号,/dev/random/dev/urandom共享与其他两个不同的相同主编号。

crw-rw-rw-  1 root      wheel            3,   2 Jul 10 20:10 /dev/null
crw-rw-rw-  1 root      wheel           14,   0 Jun 13 13:34 /dev/random
crw-rw-rw-  1 root      wheel           14,   1 Jun 13 13:34 /dev/urandom
crw-rw-rw-  1 root      wheel            3,   3 Jun 13 13:34 /dev/zero

更有趣的是,有许多设备具有相同的主要和次要编号:

crw-------  1 jleffler  staff            0,   0 Jul  8 01:54 /dev/console
crw-rw-rw-  1 root      wheel            0,   0 Jun 13 13:34 /dev/fbt
crw-rw-rw-  1 root      wheel            0,   0 Jun 13 13:34 /dev/lockstat
crw-rw-rw-  1 root      wheel            0,   0 Jun 13 13:34 /dev/machtrace
crw-rw-rw-  1 root      wheel            0,   0 Jun 13 13:34 /dev/profile
crw-rw-rw-  1 root      wheel            0,   0 Jun 13 13:34 /dev/sdt
crw-rw-rw-  1 root      wheel            0,   0 Jun 13 13:34 /dev/systrace

我不确定这些如何区分他们应该做什么。

最新更新