FreeBSD:/dev/dsp 存在(“ls -al /dev/dsp”),但在“ls -al /dev”中不显示

FreeBSD:/dev/dsp 存在(“ls -al /dev/dsp”),但在“ls -al /dev”中不显示

我正在使用FreeBSD-12.0-RELEASE-amd64,当我列出 中的所有文件时/dev,我看不到/dev/dsp(注意第一个命令后没有输出),但是当我通过显式指定其名称来列出文件时,它被发现了。更奇怪的是,当我ls -al /dev再次(和 grep for dsp,就像在初始命令中一样)时,/dev/dsp文件再次消失,但现在/dev/dsp0.0存在:

# ls -al /dev | grep dsp
# ls -al /dev/dsp
crw-rw-rw-  1 root  wheel  0x56 May 24 07:46 /dev/dsp
# ls -al /dev | grep dsp
crw-rw-rw-   1 root  wheel     0x56 May 24 07:46 dsp0.0

以上是通过在 QEMU 中运行 ISO 映像来完成的,但我也能够在真实硬件上重现这一点。只需使用默认参数启动,然后在出现的菜单中选择“Shell”,然后输入上面的命令:

qemu-system-x86_64 -soundhw hda -cdrom FreeBSD-12.0-RELEASE-amd64-disc1.iso

郑重声明:

# cat /dev/sndstat
Installed devices:
pcm0: <Generic (0x1af40022) (Analog)> (play/rec) default
No devices installed from userspace.

对我来说,列出这些/dev听起来是一个从 Linux 背景中找出 FreeBSD“看到”哪些设备/磁盘的好方法。可能有一些很好的理由(按需创建节点?)为什么它没有出现,但是是否有其他方法可以询问系统“您实际上找到了哪些设备并且可用?”无需“触摸”文件即可神奇地出现?

答案1

感谢所有的评论。我的主要收获是:

  1. 不要用于ls /dev检查系统上有哪些设备,而是使用dmesg(在声卡的特殊情况下,7.2.2 测试声音真的很有用)
  2. devfs能够按需创建设备节点(首次访问时)

其中提到的sound(4)手册页说:

上述设备节点仅通过动态devfs(5)克隆处理程序按需创建。

据我了解,“克隆处理程序”是这样的——dev_clone(9),而且确实DSP程序在 FreeBSD 源代码中调用它dsp_sysinit(),创建上面条目的代码/dev/dsp0.0

        *dev = make_dev(&dsp_cdevsw, PCMMINOR(udcmask),
            UID_ROOT, GID_WHEEL, 0666, "%s%d%s%d",
            devname, unit, devsep, cunit);

在研究的过程中,我也偶然发现重新思考 UNIX 内核中的 /dev 和设备Poul-Henning Kamp 在 BSDCon 2002 中的“按需设备创建”中说道:

这种机制的一个有趣的混合使用是声音设备驱动程序。现代声音设备有多个通道,大概是为了让用户同时收听 CNN、Napstered MP3 文件和 Quake 音效。唯一的问题是所有应用程序都尝试打开,/dev/dsp因为它们没有多个声音设备的概念。声音设备驱动程序使用克隆工具定向/dev/dsp到第一个可用的声音通道,对进程完全透明。

这种机制几乎没有缺点,主要的缺点是,ls /dev当用作系统设备清单时,现在会犯稀疏而不是丰富的错误,这种做法充其量一直是精度可疑的。

相关内容