BDL은 오디오 버퍼 자체가 아닙니다
BDL(Buffer Descriptor List)은 장치가 읽을 버퍼의 DMA 주소와 길이·제어 비트를 담은 목록입니다. BDBAR는 그 목록을 가리킵니다. CIV는 현재 descriptor, LVI는 마지막 유효 descriptor의 진행 경계를 나타냅니다. 32개 descriptor가 있다고 32개의 서로 다른 PCM 버퍼를 할당했다는 뜻은 아닙니다.
BDBAR → 32개 descriptor 목록
descriptor i → PCM ring의 period 위치
장치 진행 → 상태·IRQ → ALSA period 통지
여덟 period를 32개 항목에서 반복 참조하는 예시
v6.18.37 snd_intel8x0_setup_periods()의 일반적인 여러-period 경로는 descriptor i의 주소를 DMA 기준 주소 + (i × period_bytes) % buffer_bytes로 구성합니다. PCM prepare 경로는 runtime->dma_addr와 ALSA buffer·period 크기를 사용합니다. CPU 포인터 dma_area와 장치 DMA 주소를 같은 값으로 취급하지 않습니다.
period_bytes = 1920
buffer_bytes = 8 × 1920 = 15360
descriptor 31 offset = (31 × 1920) % 15360 = 13440따라서 descriptor 31이 여덟 번째 period를 가리킬 수 있습니다. 단일 period와 buffer 크기가 같은 특수 경로는 두 절반을 번갈아 가리키므로 위 일반 경로와 구분합니다.
480 frame과 480 sample은 다릅니다
초기 ICH 매뉴얼은 descriptor 길이를 16비트 sample 수로 표시합니다. 48,000 frame/s, stereo 16비트에서 10ms는 480 frame × 2채널 × 2B = 1920B이며, 하드웨어 길이는 960 sample입니다. 다른 세대·sample 형식에 이 단위를 그대로 적용하지 않습니다.
DMA 진행과 완료 인터럽트의 조건
CR의 run/start는 DMA 진행을 제어하고, descriptor IOC와 CR IOCE는 완료 인터럽트를 제어합니다. 드라이버의 시작 조합 ICH_IOCE | ICH_STARTBM을 보고 IOCE 자체가 DMA 실행 조건이라고 읽으면 안 됩니다. period 설정이 10ms 예시라고 모든 IRQ가 정확히 10ms 간격으로 도착하는 것도 아닙니다.
CIV·IRQ만으로 실제 재생 데이터나 DAC 출력을 입증할 수 없습니다. 이 글은 드라이버와 문서 대조이며 오디오 장치 실험을 하지 않았습니다. 재생 중인 전체 버퍼를 지우는 임의 코드는 제공하지 않습니다.
원전과 관련 글
고정 Linux 소스: BDL 구성 · Intel PRM: buffer descriptor와 DMA 제어 · ALSA·ASoC의 frame·period · DMA 주소와 소유권