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 /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시스템 장치 인벤토리로 사용될 때 풍부하지 않고 희박하다는 측면에서 오류가 발생한다는 것입니다. 이 관행은 항상 기껏해야 정확성이 의심스러웠습니다.

관련 정보