๊ฐ์ ๐
์ต๊ทผ Capture ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ ์ฝ๋์ V4L2 ํ์คํ ์์ ์ ์ํด ํ ๊ฐ์ง ์ ๋ฌด๋ฅผ ํ ๋น ๋ฐ์๋ค. ๊ฑฐ์ ์ผ์ฃผ์ผ ๋์ ํค๋งค์๋๋ฐ ๋ค๋ฅธ ์ ์ ๊ฐ๋ฐ์๊ฐ ๋ช ์๊ฐ ๋ง์ ์ฝ๋๋ฅผ ์์ ํ๋ ๊ธฐ๋ํ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค๋ ๊ฒ์ฒ๋ผ ๋ณด์๋ค. ์ด๋ป๊ฒ ๋์์ด ๊ฐ๋ฅํ์๊น ๋จธ๋ฆฌ๋ก ์ดํด๊ฐ ๋์ง์์ ํ ์์ผ ํ๋ฃจ์ข ์ผ V4L2 ํ๋ ์์ํฌ์ LWN ์ ๋ค์ ธ๊ฐ๋ฉฐ ํ๋ ์์ํฌ๋ฅผ ๋ถ์ํ๊ณ ๋๋ ์ ๊ทธ๋์ ์ดํด๊ฐ ์๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ๋ฌด์์ด ์๋ชป๋๋์ง๋ฅผ ํ์ ํ ์ ์์๋ค.
๋ณธ๋ก ์ ๋ค์ด๊ฐ๊ธฐ์ ์์, V4L2 (Video for Linux) ์ Video Buffer ์ ๋ํด ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด, V4L2๋ Video Streaming I/O ๋ฅผ ์ง์ํ๊ธฐ ์ํ ํ๋ ์์ํฌ์ด๋ค. ์คํธ๋ฆฌ๋ฐ API์ด๋ฏ๋ก ์ฑ๋ฅ์ด ์ค์ํ๊ณ userspace์ kernel ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ตํ์์ ๋ฐ๋์ zero-copy๊ฐ ์ด๋ค์ ธ์ผ ํ๋ค. ์ด ๋๋ฌธ์ ๊ตฌํํด์ผ ํ๋ API๋ค์ด ๊ฝค ๋ณต์กํ๋ค. ๋ณต์ก์ฑ์ ์กฐ๊ธ์ด๋ผ๋ ์ค์ด๊ธฐ ์ํด, ์คํธ๋ฆฌ๋ฐ์ ์ฌ์ฉํ๋ ๋ฒํผ์ ๊ด๋ จ๋ ์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ ๋์จ ๊ฒ์ด ํ์ฌ์ Video Buffer ํ๋ ์์ํฌ์ด๋ค(ํ์ฌ ๋ฒ์ ์ 2์ด๋ค). ๋ฒํผ์ฉ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ํด ๊ธฐ๋ณธ์ ์ธ memory allocator๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ ๋ฐฉ์์ ๋ฐ๋ผ ์๋์ ๊ฐ์ด ์ง์๋๋ค.
- vmalloc
- dma_contig
- dma_contig_sg
vmalloc ์ ๊ฒฝ์ฐ ์ปค๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์์๋ ์ฐ์์ ์ด์ง๋ง ์ค์ ๋ฌผ๋ฆฌ์ ์ผ๋ก๋ ์ฐ์์ ์ด์ง ์์ง๋ง ๋น๊ต์ ํจ์จ์ ์ด๋ค. IOMMU๊ฐ ์ง์๋์ง ์๋ ๊ฒฝ์ฐ ์ง์ DMA์ ๋งคํํ๋๋ฐ ํ๊ณ๊ฐ ์๋ค. dma_contig์ ๊ฐ์ ๊ฒฝ์ฐ ๋ฌผ๋ฆฌ/๊ฐ์ ์ฃผ์์์ ์ฐ์๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น๋ฐ๋๋ค. ๋ฌผ๋ฆฌ/๊ฐ์ ์ฃผ์์์ ๋์ผํ๊ฒ ๋น์ฐ์์ ์ธ ๊ฒฝ์ฐ๋ dma_contig_sg๋ฅผ ์ฌ์ฉํ๋ค. ์ด ๊ฒฝ์ฐ ํ๋์จ์ด ์ ์ผ๋ก scatter/gather DMA operation์ด ์ง์๋์ด์ผ ํ๋ ์ ์ฝ์ฌํญ์ด ์๋ค.
๋ฌธ์ ๐
IOMMU๊ฐ ์ง์๋์ง ์์ผ๋ฉด์ vmalloc์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๊ธฐ์ dma_contig๋ฅผ ์ด์ฉํ์ฌ ํ ๋น๋ฐ์ ์ฌ์ฉํด์ผ ํ๋ค. ์ด์ dma_contig ๋ฒํผ ํ์ ์ผ๋ก ๋ฒํผ ํ ๋น์ ํ๋ฉด์ DMABUF ๋ฐฉ์์ ์ง์ํ๋๋ก ์ง์๋ฅผ ๋ฐ์๋๋ฐ ์ฌ๊ธฐ์ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์๋ค. DMABUF ๋ฐฉ์์ ์ฌ์ฉ ๋ชฉ์ ์ ๊ณ ๋ คํ์ง ์์๋ค๋ ์ ์ด๋ค.
ํ ๋น์๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๋ฐฐ๊ฒฝ์ ์ดํดํ์ง๋ง, DMABUF ๋ฐฉ์์ ์ดํดํ ์ ์์๋ค. ‘์ ์ดํด๊ฐ ์๋๋ ๊ฒ์ธ์ง’๊ฐ ๋จธ๋ฆฌ๋ก ์ดํด๊ฐ ์๋๋ ๋ต๋ตํจ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์์๋๋ฐ, ๊ฐ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด์ ์ฐ์ ์ ์ผ๋ก ์์๋ณด์ง ์์๋ ๊ฒ์ด ๋ฌธ์ ์๋ค.
V4L2 memory์๋ ์๋์ ๊ฐ์ด MMAP/USERPTR/OVERLAY/DMABUF ๋ฑ์ด ์ ๊ณต๋๋ค.
OVERLAY๋ ์๋ตํ๊ณ ๋๋จธ์ง๋ฅผ ๋ณด๋ฉด, ๋จผ์ MMAP์ ๋๋ผ์ด๋ฒ๊ฐ ๋ฒํผ๋ฅผ ํ ๋นํ์ฌ userspace์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋งคํํด์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ชฉ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ด๋ค. USERPTR์ ๋ฐ๋๋ก userspace application์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ฌ ๋๋ผ์ด๋ฒ์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง DMABUF๋ ๋ค๋ฅธ ๋๋ฐ์ด์ค์์ ์ด๋ฏธ ํ ๋นํ ‘shared buffer’๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ด๋ค. ์ฆ, v4l2 ioctl์ ์ดํฝํ์ฌ ์๋ฌด๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ผ์ด๋ฒ ์ชฝ์ผ๋ก request buffer๋ฅผ ํด๋ดค์ DMABUF ๋ฐฉ์์์๋ memory allocation์ด ์๋๋ค๋ ์ ์ด๋ค. ์ด๋ฏธ ๋ค๋ฅธ ๋๋ฐ์ด์ค์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ค์ ์ฝ๋๋ฅผ ๋ณด์์ ๋๋, ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ ๋์๋ MMAP ๋ฐฉ์์ ์ ์ธํ ๋๋จธ์ง ๋ฉ๋ชจ๋ฆฌ ํ์ ์์๋ request buffer๋ฅผ ํ์ ๋ ๊ด๋ จ๋ ์ ๋ณด๋ค๋ง ์ค์ ํ ๋ฟ์ด์ง ๋ฒํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ์๋๋ค.
๋๋งบ์ ๐
๋ค์ ์ฃผ์๋ V4L2_MEMORY_MMAP์ผ๋ก ํ ๋นํ ๋ค, ์ด๋ฅผ expbuf ๋ฅผ ์ด์ฉํ์ฌ DMABUF ๋ฐฉ์์ผ๋ก share buffer ํํ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ๋ค์ ํ์ฉํ ์ ์๋๋ก ์ฝ๋๊ฐ ๊ตฌํ๋์ด ์๋์ง, ์ด๋ป๊ฒ ํ๋ฉด ๊ฐ์ ํ ์ ์๋์ง ์ข ๋ ์ฐพ์๋ณด๋ ค ํ๋ค. ์ด์ ์์ผ DMABUF์ ์ด๋ฆ์ด ๋๋ฐ์ด์ค์์ DMA๋ฅผ ์ํด ์ฌ์ฉํ๋ ๋ฒํผ๋ค์ ๋ค๋ฅธ ๋๋ฐ์ด์ค์์ ๊ณต์ ํ ์ ์๋๋ก ํ๊ธฐ ์ํด ๋ช ๋ช ๋ ๊ฒ์ด๋ผ ์ดํดํ ์ ์๊ฒ ๋์๋ค. DMABUF์ exporter & importer ๊ธฐ๋ฅ์ด ์๋ชป ์ดํด๋์ด request buffer ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์๋ํ๋ ์ฝ๋๊ฐ ์๋์ง๋ ํจ๊ป ์ดํด๋ด์ผ๊ฒ ๋ค.