執行人: hankTaro
專題解說錄影
vcam 是個針對 Linux 核心開發的虛擬攝影機裝置,全部程式碼僅 1 千 5 百行,從而可理解 V4L2 (video fro Linux APIs, version 2) 的使用和 Linux 多媒體架構。
閱讀以下報告,並針對 Linux v5.15+ 的 V4L2 介面 (及異動),予以更新,應包含 V4L2 和 vcam 運作原理,可善用 HackMD 書本模式展現。
可沿用過去的內容,但應該在整理的材料開頭提及貢獻者。紀錄你的認知和疑惑。
V4L2 全名為 video for linux two ,前身為 V4L ,故 V4L2 尾端的 2 是2代的概念
V4L2 是 linux 中的一個驅動程式框架,其作為 API 支援實時(realtime)影音捕捉,他提供不同硬體一個統一的框架,像是你電腦的攝影機與螢幕之間,sensor 獲取了資料,要如何處理這些資料、怎麼傳輸、傳輸到哪,都是在 V4L2 的框架下統一管理。
為何需要一個這樣的框架去架在裝置與裝置之間,因為在過去不同裝置之間會需要有個別的驅動程序來供其運作,這是一件耗時且困難的工作,也容易使得裝置不正確運作,並且許多通用的代碼由於沒有共同框架,在代碼重構上會十分困難,故 V4L2 提供一個驅動框架收錄了各類驅動所需的基礎架構塊(basic building blocks),可以依照使用者所需選用。
在Linux 中,所有裝置都被看成一種特殊的文件,可以像存取一般文件一樣對其進行讀寫。像是筆電的攝影機就是在 /dev/videoX
(其中X
是數字,取決於有幾個註冊的攝影裝置),V4L2 藉由對其記憶體映射(mmap)或直接讀取(read)來採集影像。
V4L2規範中不僅定義了通用API元素(Common API Elements),圖像的格式(Image Formats),輸入/輸出方法(Input/Output),還定義了Linux內核驅動處理視頻信息的一系列介面(Interfaces),這些介面主要有:
對於使用者來說,V4L2 的大體操作流程如下:
依據 2022 年開發紀錄,確保 vcam 可通過所有 v4l2-compliance 的測試項目,若有無法通過,則逐一排除。
使用 sudo v4l2-compliance -d /dev/video2 -f
測試
但是在使用 kmemleak 前,需要先編譯核心,使其可以運作,因為這個工具並非是正常使用者會使用到的,故開發者沒必要讓其在所有環境下都執行(另一方面也不是所有環境下都能讓此工具運做),故其只能在特定狀況下運行,而要如何打造這個環境就是首要的目標
根據 測試 Linux 核心的虛擬化環境 來設定環境
在使用 virtme 選取預設核心組態並編譯階段,需要確保 CONFIG_DEBUG_INFO 在組態中有被開啟,以利後續實驗使用,並且在kmemleak 文件中寫到,需要先將 CONFIG_DEBUG_KMEMLEAK enable。
執行 $ grep CONFIG_DEBUG_INFO .config
若輸出沒有出現 CONFIG_DEBUG_INFO=y
,如下
會需要執行 make menuconfig
進行設定
6.1.x 的CONFIG_DEBUG_INFO和CONFIG_DEBUG_KMEMLEAK是依照此位置
在你的抵達位置時不一定會找到 Compile the kernel with debug info 這個選項,你需要將 Debug information 設定成任一顯示方法,個人是設定成用 DWARF 4代格式顯示
隨後就會出現其選項了
隨後就出現了 CONFIG_DEBUG_INFO=y
隨後等待其 make 結束(會需要一段時間),在編譯結束後,預期可見以下訊息:
隨後便可透過以下命令,在 QEMU 虛擬機器中啟動 Linux 核心:
要注意一點,在 virtme 中,除了/tmp 外的路徑都是唯獨的,若要寫入需要切換到 host 端
確保 Debug Filesystem 是開啟的
照著測試 Linux 核心的虛擬化環境中,編譯和測試核心模組的步驟,撰寫 hello.c 以及Makefile
在測試 Linux 核心的虛擬化環境中, Makefile 的代碼有誤
KDIR := $(PWD)/..
這行會導致 KDIR 導引到錯誤位置,故將其刪除
以及要將 KDIR=/home/ubuntu/linux
設定為自己存放虛擬環境的目錄
隨後便可測試載入以及移除模組
因為 vcam 需要 videobuf2-vmalloc videobuf2-v4l2 兩個核心模組作為前製,
發現 make modules 也只有少少幾個 ko 檔被編譯出來
在與教授討論並重新詳閱 kernelconfig 加上反覆驗證後,得知需要在編譯核心時設定 CONFIG_MEDIA_SUPPORT = y
才會編譯出相關的 ko 檔
使用 /
搜尋 VIDEOBUF2_V4L2,找出使其 enable 的設定
需要將自動選擇附加功能的這個選項關掉
隨後 make 完使用 make modules_install ,便可見到需要的那兩個 ko 檔
架設成功
發生了 oom (out of memory),由於執行 kmemleak 需要較大的記憶體,故退出虛擬環境利用virtme-run --kdir . --mods=auto --qemu-opts -m 2048
配置 2048 的記憶體大小
再度執行 make
成功通過
隨後將 vcam.ko 架設上,並開始測試
執行 # mount -t debugfs nodev /sys/kernel/debug/
後,利用 mount | grep "debug"
確認
確認已成功裝上