FreeBSD:/dev/dsp 存在(“ls -al /dev/dsp”),但不在“ls -al /dev”中顯示
我正在使用
FreeBSD-12.0-RELEASE-amd64
,當我列出 中的所有文件時/dev
,我看不到/dev/dsp
(注意在第一個命令之後沒有輸出),但是當我通過顯式指定文件名稱列出文件時,找到了它。更奇怪的是,當我ls -al /dev
再次(和 grep fordsp
,就像在初始命令中一樣)時,/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“看到”哪些設備/磁碟的好方法。可能有一些很好的理由(按需創建節點?)為什麼它沒有出現,但是還有其他方法可以詢問系統“你實際找到了哪些設備並且可用?” 無需“觸摸”文件讓它們神奇地出現?
感謝所有的評論。對我來說主要的收穫是:
- 不要
ls /dev
用於檢查系統上有哪些設備,而是使用dmesg
(在音效卡的特定情況下,7.2.2 測試聲音真的很有用)devfs
能夠按需創建設備節點(首次訪問時)提到的
sound(4)
聯機幫助頁說:
devfs(5)
上述設備節點僅通過動態複製處理程序按需創建。那裡的“複製處理程序” - 據我所知 -
dev_clone(9)
並且確實在 FreeBSD 原始碼中的dsp.cdsp_sysinit()
呼叫它,創建上述/dev/dsp0.0
條目的程式碼:*dev = make_dev(&dsp_cdevsw, PCMMINOR(udcmask), UID_ROOT, GID_WHEEL, 0666, "%s%d%s%d", devname, unit, devsep, cunit);
在研究過程中,我還偶然發現了 Poul-Henning Kamp 在 BSDCon 2002中的 Rethinking /dev and devices in the UNIX kernel,它在“按需設備創建”中說:
這種機制的一個有趣的混合使用是與聲音設備驅動程序一起使用。現代聲音設備有多個聲道,大概是為了讓使用者同時收聽 CNN、Napstered MP3 文件和 Quake 音效。唯一的問題是所有應用程序都試圖打開
/dev/dsp
,因為它們沒有多個聲音設備的概念。聲音設備驅動程序使用複製工具以/dev/dsp
對程序完全透明的方式定向到第一個可用聲道。這種機制幾乎沒有缺點,主要的缺點是
ls /dev
現在在用作系統設備清單時會在稀疏端而不是在豐富端犯錯,這種做法充其量一直是令人懷疑的精確度。