我正在使用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
感谢所有的评论。我的主要收获是:
- 不要用于
ls /dev
检查系统上有哪些设备,而是使用dmesg
(在声卡的特殊情况下,7.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
当用作系统设备清单时,现在会犯稀疏而不是丰富的错误,这种做法充其量一直是精度可疑的。