Freebsd

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

  • May 26, 2019

我正在使用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 測試聲音真的很有用)
  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現在在用作系統設備清單時會在稀疏端而不是在豐富端犯錯,這種做法充其量一直是令人懷疑的精確度。

引用自:https://unix.stackexchange.com/questions/520808