V4L2 Memory Type

ยท 1481 words ยท 3 minute read

๊ฐœ์š” ๐Ÿ”—

์ตœ๊ทผ 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 ๋“ฑ์ด ์ œ๊ณต๋œ๋‹ค.

1
2
3
4
5
enum v4l2_memory {
    V4L2_MEMORY_MMAP             = 1,
    V4L2_MEMORY_USERPTR          = 2,
    V4L2_MEMORY_OVERLAY          = 3,
    V4L2_MEMORY_DMABUF           = 4,

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 ์‹œ์— ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์‹œ๋„ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€๋„ ํ•จ๊ป˜ ์‚ดํŽด๋ด์•ผ๊ฒ ๋‹ค.