【问题标题】:Are pseudo-devices implemented as device drivers within the kernel?伪设备是否在内核中实现为设备驱动程序?
【发布时间】:2017-12-13 13:17:48
【问题描述】:

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

我的假设对吗?

【问题讨论】:

  • 是的;至少在传统上,所有设备(无论是否伪设备)都在内核中作为设备驱动程序实现。通常,支持功能的实现对于伪设备来说是最小的。 /dev/nullwrite 代码没有成功执行任何操作(/dev/zero 可能也是如此); /dev/null 的读取代码报告“无数据”; /dev/zero 的读取代码将给定的缓冲区归零。等等。在过去的 20 年里,情况可能发生了一些变化,但这或多或少是过去的样子,我希望它仍然是这样(但我活着会感到惊讶)。
  • @JonathanLeffler 在我正在使用的 Linux 系统上,也许在其他 Linux 系统上/dev/null/dev/zero/dev/random 都具有相同的主编号。
  • 好的;有什么问题?它们具有不同的次要编号,因此彼此做不同的事情,就像不同的磁盘驱动器可能共享一个主要编号但次要编号区分主设备的不同子部分,甚至完全区分不同的驱动器。
  • @JonathanLeffler 是的,没错。我只是说在 Linux 中提到的伪设备使用相同的驱动程序。如果您希望将其作为答案发布,那么您的第一个命令应该是一个真正的答案,所以我接受它。

标签: unix drivers


【解决方案1】:

至少在传统上,所有设备(无论是否伪设备)都是作为设备驱动程序在内核中实现的。通常,支持功能的实现对于伪设备来说是最小的。 /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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2011-07-29
    • 2016-12-10
    • 2018-05-23
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多