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

Are pseudo-devices implemented as device drivers within the kernel?

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

我的假设对吗?

至少在传统上,所有设备——无论是伪造的还是伪造的——都在内核中实现为设备驱动程序。通常,伪设备的支持功能的实现很少。 /dev/null 的编写代码没有成功执行任何操作(/dev/zero 可能也是如此); /dev/null 报告 'no data' 的读取代码; /dev/zero 的读取代码将给定的缓冲区归零。等等。在过去的 20 年里,情况可能发生了一些变化,但这或多或少是过去的样子,我希望它仍然是这样的(但我活着很惊讶)。

On the Linux system I'm using, and maybe on other Linux systems, /dev/null, /dev/zero and /dev/random all have the same major number though.

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

在 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

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