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ないことに注意してください。もう1つのことは、再び移動すると(初期コマンドと同様にls -al /devgrep 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.

これらのサウンドのリストは、/devLinuxの背景でFreeBSDが「認識」するデバイス/ディスクを見つけるための良い方法のようです。表示されないには妥当な理由(要求時にノードの生成?)があるかもしれませんが、ファイルを「タッチ」することなく「実際にどのデバイスを見つけて使用できましたか?」とシステムに尋ねる別の方法はありますか?魔法のように現れますか?

答え1

全てのコメントありがとうございます。私の主な示唆点は次のとおりです。

  1. ls /devシステムにどのデバイスがあるかを確認するために使用するのではなく、代わりに使用してくださいdmesg(サウンドカードの特別な場合は、7.2.2 テストサウンド本当に便利です)
  2. devfs要求時に(最初のアクセス時に)デバイスノードを作成する機能

そこに言及されているsound(4)マニュアルページには次のように記載されています。

上記のデバイスノードは、devfs(5)ダイナミックレプリケーションハンドラを介して要求時にのみ生成されます。

私が知る限り、「複製ハンドラ」は次のとおりです。dev_clone(9)、そして実際にDSPプログラムdsp_sysinit()上記のエントリを生成したコードであるFreeBSDソースコードからそれを呼び出します/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システムデバイスのインベントリとして使用する場合、豊富ではなく希薄であるという点でエラーが発生することです。この慣行は常にせいぜい正確さが疑われていました。

関連情報