Try   HackMD

Linux 核心專題: 虛擬攝影機裝置驅動程式

執行人: hankTaro
專題解說錄影

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
提問清單

  • ?

任務簡述

vcam 是個針對 Linux 核心開發的虛擬攝影機裝置,全部程式碼僅 1 千 5 百行,從而可理解 V4L2 (video fro Linux APIs, version 2) 的使用和 Linux 多媒體架構。

TODO: 整理過往報告

閱讀以下報告,並針對 Linux v5.15+ 的 V4L2 介面 (及異動),予以更新,應包含 V4L2 和 vcam 運作原理,可善用 HackMD 書本模式展現。

可沿用過去的內容,但應該在整理的材料開頭提及貢獻者。紀錄你的認知和疑惑。

V4L2 架構與簡介

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),這些介面主要有:

  • 視頻採集介面——Video Capture Interface;
  • 視頻輸出介面—— Video Output Interface;
  • 視頻覆蓋/預覽介面——Video Overlay Interface;
  • 視頻輸出覆蓋介面——Video Output Overlay Interface;
  • 編解碼介面——Codec Interface。

對於使用者來說,V4L2 的大體操作流程如下:

  • Opening the device
  • Changing device properties, selecting a video and audio input, video standard, picture brightness a. o.
  • Negotiating a data format
  • Negotiating an input/output method
  • The actual input/output loop
  • Closing the device

v4l2 framework

確認通過 v4l2-compliance

依據 2022 年開發紀錄,確保 vcam 可通過所有 v4l2-compliance 的測試項目,若有無法通過,則逐一排除。

使用 sudo v4l2-compliance -d /dev/video2 -f 測試

5.19.0 測試結果

$ sudo v4l2-compliance -d /dev/video2 -f
v4l2-compliance 1.22.1, 64 bits, 64-bit time_t

Compliance test for vcam device /dev/video2:

Driver Info:
	Driver name      : vcam
	Card type        : vcam
	Bus info         : platform: virtual
	Driver version   : 5.19.17
	Capabilities     : 0x85200001
		Video Capture
		Read/Write
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      : 0x05200001
		Video Capture
		Read/Write
		Streaming
		Extended Pix Format

Required ioctls:
	test VIDIOC_QUERYCAP: OK
	test invalid ioctls: OK

Allow for multiple opens:
	test second /dev/video2 open: OK
	test VIDIOC_QUERYCAP: OK
	test VIDIOC_G/S_PRIORITY: OK
	test for unlimited opens: OK

Debug ioctls:
	test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
	test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
	test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
	test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
	test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
	test VIDIOC_ENUMAUDIO: OK (Not Supported)
	test VIDIOC_G/S/ENUMINPUT: OK
	test VIDIOC_G/S_AUDIO: OK (Not Supported)
	Inputs: 1 Audio Inputs: 0 Tuners: 0

Output ioctls:
	test VIDIOC_G/S_MODULATOR: OK (Not Supported)
	test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
	test VIDIOC_ENUMAUDOUT: OK (Not Supported)
	test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
	test VIDIOC_G/S_AUDOUT: OK (Not Supported)
	Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
	test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
	test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
	test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
	test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls (Input 0):
	test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
	test VIDIOC_QUERYCTRL: OK (Not Supported)
	test VIDIOC_G/S_CTRL: OK (Not Supported)
	test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
	test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
	test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
	Standard Controls: 0 Private Controls: 0

Format ioctls (Input 0):
	test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
	test VIDIOC_G/S_PARM: OK
	test VIDIOC_G_FBUF: OK (Not Supported)
	test VIDIOC_G_FMT: OK
	test VIDIOC_TRY_FMT: OK
	test VIDIOC_S_FMT: OK
	test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
	test Cropping: OK (Not Supported)
	test Composing: OK (Not Supported)
	test Scaling: OK (Not Supported)

Codec ioctls (Input 0):
	test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
	test VIDIOC_G_ENC_INDEX: OK (Not Supported)
	test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls (Input 0):
	test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
	test VIDIOC_EXPBUF: OK
	test Requests: OK (Not Supported)

Test input 0:

Stream using all formats:
	test MMAP for Format RGB3, Frame Size 640x480@59.94 Hz:
		Stride 1920, Field None: OK                                 
	test MMAP for Format RGB3, Frame Size 640x480@1.00 Hz:
		Stride 1920, Field None: OK                                 
Total for vcam device /dev/video2: 47, Succeeded: 47, Failed: 0, Warnings: 0

6.1.32 虛擬環境測試結果

root@(none):/tmp/vcam#  v4l2-compliance -d /dev/video0 -f
v4l2-compliance 1.22.1, 64 bits, 64-bit time_t

Compliance test for vcam device /dev/video0:

Driver Info:
	Driver name      : vcam
	Card type        : vcam
	Bus info         : platform: virtual
	Driver version   : 6.1.35
	Capabilities     : 0x85200001
		Video Capture
		Read/Write
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      : 0x05200001
		Video Capture
		Read/Write
		Streaming
		Extended Pix Format

Required ioctls:
	test VIDIOC_QUERYCAP: OK
	test invalid ioctls: OK

Allow for multiple opens:
	test second /dev/video0 open: OK
	test VIDIOC_QUERYCAP: OK
	test VIDIOC_G/S_PRIORITY: OK
	test for unlimited opens: OK

Debug ioctls:
	test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
	test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
	test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
	test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
	test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
	test VIDIOC_ENUMAUDIO: OK (Not Supported)
	test VIDIOC_G/S/ENUMINPUT: OK
	test VIDIOC_G/S_AUDIO: OK (Not Supported)
	Inputs: 1 Audio Inputs: 0 Tuners: 0

Output ioctls:
	test VIDIOC_G/S_MODULATOR: OK (Not Supported)
	test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
	test VIDIOC_ENUMAUDOUT: OK (Not Supported)
	test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
	test VIDIOC_G/S_AUDOUT: OK (Not Supported)
	Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
	test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
	test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
	test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
	test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls (Input 0):
	test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
	test VIDIOC_QUERYCTRL: OK (Not Supported)
	test VIDIOC_G/S_CTRL: OK (Not Supported)
	test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
	test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
	test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
	Standard Controls: 0 Private Controls: 0

Format ioctls (Input 0):
	test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
	test VIDIOC_G/S_PARM: OK
	test VIDIOC_G_FBUF: OK (Not Supported)
	test VIDIOC_G_FMT: OK
	test VIDIOC_TRY_FMT: OK
	test VIDIOC_S_FMT: OK
	test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
	test Cropping: OK (Not Supported)
	test Composing: OK (Not Supported)
	test Scaling: OK (Not Supported)

Codec ioctls (Input 0):
	test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
	test VIDIOC_G_ENC_INDEX: OK (Not Supported)
	test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls (Input 0):
	test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
	test VIDIOC_EXPBUF: OK
	test Requests: OK (Not Supported)

Test input 0:

Stream using all formats:
	test MMAP for Format RGB3, Frame Size 640x480@59.94 Hz:
		Stride 1920, Field None: OK                                 
	test MMAP for Format RGB3, Frame Size 640x480@1.00 Hz:
		Stride 1920, Field None: OK                                 
Total for vcam device /dev/video0: 47, Succeeded: 47, Failed: 0, Warnings: 0

TODO: 排除記憶體錯誤

運用 kmemleakkasan 排除記憶體錯誤

但是在使用 kmemleak 前,需要先編譯核心,使其可以運作,因為這個工具並非是正常使用者會使用到的,故開發者沒必要讓其在所有環境下都執行(另一方面也不是所有環境下都能讓此工具運做),故其只能在特定狀況下運行,而要如何打造這個環境就是首要的目標

打造虛擬環境

根據 測試 Linux 核心的虛擬化環境 來設定環境

在使用 virtme 選取預設核心組態並編譯階段,需要確保 CONFIG_DEBUG_INFO 在組態中有被開啟,以利後續實驗使用,並且在kmemleak 文件中寫到,需要先將 CONFIG_DEBUG_KMEMLEAK enable。

執行 $ grep CONFIG_DEBUG_INFO .config 若輸出沒有出現 CONFIG_DEBUG_INFO=y ,如下

CONFIG_DEBUG_INFO_NONE=y
# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set
# CONFIG_DEBUG_INFO_DWARF4 is not set
# CONFIG_DEBUG_INFO_DWARF5 is not set

會需要執行 make menuconfig 進行設定

6.1.x 的CONFIG_DEBUG_INFOCONFIG_DEBUG_KMEMLEAK是依照此位置

在你的抵達位置時不一定會找到 Compile the kernel with debug info 這個選項,你需要將 Debug information 設定成任一顯示方法,個人是設定成用 DWARF 4代格式顯示

隨後就會出現其選項了

隨後就出現了 CONFIG_DEBUG_INFO=y

$ grep CONFIG_DEBUG_INFO .config
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_NONE is not set
# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set
CONFIG_DEBUG_INFO_DWARF4=y
# CONFIG_DEBUG_INFO_DWARF5 is not set
# CONFIG_DEBUG_INFO_REDUCED is not set
CONFIG_DEBUG_INFO_COMPRESSED=y
# CONFIG_DEBUG_INFO_SPLIT is not set

隨後等待其 make 結束(會需要一段時間),在編譯結束後,預期可見以下訊息:

Kernel: arch/x86/boot/bzImage is ready

隨後便可透過以下命令,在 QEMU 虛擬機器中啟動 Linux 核心:

$ virtme-run --kdir . --mods=auto

要注意一點,在 virtme 中,除了/tmp 外的路徑都是唯獨的,若要寫入需要切換到 host 端

確保 Debug Filesystem 是開啟的

編譯和測試核心模組

照著測試 Linux 核心的虛擬化環境中,編譯和測試核心模組的步驟,撰寫 hello.c 以及Makefile

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");

static int hello_init(void)
{
    printk(KERN_ALERT "Hello World! - init\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "Hello World! - exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

KDIR=/home/ubuntu/linux

obj-m += hello.o

PWD := $(shell pwd)

all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
    $(MAKE) -C $(KDIR) M=$(PWD) clean

測試 Linux 核心的虛擬化環境中, Makefile 的代碼有誤
KDIR := $(PWD)/.. 這行會導致 KDIR 導引到錯誤位置,故將其刪除

以及要將 KDIR=/home/ubuntu/linux 設定為自己存放虛擬環境的目錄

# make
make -C /home/hank/linux2023/virtme/linux M=/tmp/hello modules
make[1]: Entering directory '/home/hank/linux2023/virtme/linux'
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0
  You are using:           gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0
  CC [M]  /tmp/hello/hello.o
  MODPOST /tmp/hello/Module.symvers
  CC [M]  /tmp/hello/hello.mod.o
  LD [M]  /tmp/hello/hello.ko
make[1]: Leaving directory '/home/hank/linux2023/virtme/linux'

隨後便可測試載入以及移除模組

# insmod hello.ko 
[  902.474833] Hello World! - init

# rmmod hello 
[  934.470132] Hello World! - exit

嘗試建立 ko 檔

因為 vcam 需要 videobuf2-vmalloc videobuf2-v4l2 兩個核心模組作為前製,

$ sudo make modules_install modules=videobuf2-vmalloc
[sudo] hank 的密碼: 
make[1]: *** 沒有規則可製作目標「videobuf2-vmalloc」,由「__modinst」 需求。 停止。
make: *** [Makefile:1941:modules_install] 錯誤 2

發現 make modules 也只有少少幾個 ko 檔被編譯出來

$ make modules
  UPD     include/generated/compile.h
  CC      scripts/mod/empty.o
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/modpost.o
  CC      scripts/mod/devicetable-offsets.s
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTLD  scripts/mod/modpost
  CC      kernel/bounds.s
  CC      arch/x86/kernel/asm-offsets.s
  CALL    scripts/checksyscalls.sh
  DESCEND objtool
  CC [M]  fs/efivarfs/inode.o
  CC [M]  fs/efivarfs/file.o
  CC [M]  fs/efivarfs/super.o
  CC [M]  fs/efivarfs/vars.o
  LD [M]  fs/efivarfs/efivarfs.o
  CC [M]  drivers/thermal/intel/x86_pkg_temp_thermal.o
  CC [M]  net/netfilter/nf_log_syslog.o
  CC [M]  net/netfilter/xt_mark.o
  CC [M]  net/netfilter/xt_nat.o
  CC [M]  net/netfilter/xt_LOG.o
  CC [M]  net/netfilter/xt_MASQUERADE.o
  CC [M]  net/netfilter/xt_addrtype.o
  CC [M]  net/ipv4/netfilter/iptable_nat.o
  MODPOST Module.symvers
  LDS     scripts/module.lds
  CC [M]  drivers/thermal/intel/x86_pkg_temp_thermal.mod.o
  LD [M]  drivers/thermal/intel/x86_pkg_temp_thermal.ko
  CC [M]  fs/efivarfs/efivarfs.mod.o
  LD [M]  fs/efivarfs/efivarfs.ko
  CC [M]  net/ipv4/netfilter/iptable_nat.mod.o
  LD [M]  net/ipv4/netfilter/iptable_nat.ko
  CC [M]  net/netfilter/nf_log_syslog.mod.o
  LD [M]  net/netfilter/nf_log_syslog.ko
  CC [M]  net/netfilter/xt_LOG.mod.o
  LD [M]  net/netfilter/xt_LOG.ko
  CC [M]  net/netfilter/xt_MASQUERADE.mod.o
  LD [M]  net/netfilter/xt_MASQUERADE.ko
  CC [M]  net/netfilter/xt_addrtype.mod.o
  LD [M]  net/netfilter/xt_addrtype.ko
  CC [M]  net/netfilter/xt_mark.mod.o
  LD [M]  net/netfilter/xt_mark.ko
  CC [M]  net/netfilter/xt_nat.mod.o
  LD [M]  net/netfilter/xt_nat.ko

在與教授討論並重新詳閱 kernelconfig 加上反覆驗證後,得知需要在編譯核心時設定 CONFIG_MEDIA_SUPPORT = y 才會編譯出相關的 ko 檔

videobuf2-vmalloc.kovideobuf2-v4l2.ko 都依賴於此

使用 / 搜尋 VIDEOBUF2_V4L2,找出使其 enable 的設定

需要將自動選擇附加功能的這個選項關掉

隨後 make 完使用 make modules_install ,便可見到需要的那兩個 ko 檔

root@(none):/# modprobe videobuf2_v4l2 videobuf2_vmalloc
root@(none):/# lsmod
Module                  Size  Used by
videobuf2_vmalloc      16384  0
videobuf2_memops       16384  1 videobuf2_vmalloc
videobuf2_v4l2         36864  0
videobuf2_common       65536  3 videobuf2_vmalloc,videobuf2_v4l2,videobuf2_memops

架設成功

嘗試在虛擬環境中 make vcam

root@(none):/tmp/vcam# make
make -C /lib/modules/6.1.35/build M=/tmp/vcam modules
make[1]: Entering directory '/home/hank/linux2023/virtme/linux'
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0
  You are using:           gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0
  CC [M]  /tmp/vcam/module.o
  CC [M]  /tmp/vcam/control.o
...
[  190.819560] Tasks state (memory values in pages):
[  190.819844] [  pid  ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
[  190.820366] [     98]     0    98     5780      528    61440        0             0 systemd-udevd
[  190.820890] [    163]     0   163     1193      151    45056        0             0 bash
[  190.821362] [    169]     0   169      795       77    45056        0             0 make
[  190.821871] [    171]     0   171      879      165    45056        0             0 make
[  190.822344] [    386]     0   386      897      169    45056        0             0 make
[  190.822821] [    409]     0   409      724       38    49152        0             0 sh
[  190.823284] [    410]     0   410      939       43    40960        0             0 gcc
[  190.823756] [    411]     0   411    18841     9025   188416        0             0 cc1
[  190.824284] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,task=cc1,pid=411,uid=0
[  190.824992] Out of memory: Killed process 411 (cc1) total-vm:75364kB, anon-rss:35828kB, file-rss:272kB, shmem-rss:0kB, UID:0 pgtables:184kB oom_score_adj:0
gcc: fatal error: Killed signal terminated program cc1
compilation terminated.
make[2]: *** [scripts/Makefile.build:250: /tmp/vcam/control.o] Error 1
make[1]: *** [Makefile:2012: /tmp/vcam] Error 2
make[1]: Leaving directory '/home/hank/linux2023/virtme/linux'
make: *** [Makefile:14: kmod] Error 2
root@(none):/tmp/vcam# 

發生了 oom (out of memory),由於執行 kmemleak 需要較大的記憶體,故退出虛擬環境利用virtme-run --kdir . --mods=auto --qemu-opts -m 2048 配置 2048 的記憶體大小

再度執行 make

root@(none):/tmp/vcam# make
make -C /lib/modules/6.1.35/build M=/tmp/vcam modules
make[1]: Entering directory '/home/hank/linux2023/virtme/linux'
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0
  You are using:           gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0
  CC [M]  /tmp/vcam/module.o
  CC [M]  /tmp/vcam/control.o
  CC [M]  /tmp/vcam/device.o
  CC [M]  /tmp/vcam/videobuf.o
  CC [M]  /tmp/vcam/fb.o
  LD [M]  /tmp/vcam/vcam.o
  MODPOST /tmp/vcam/Module.symvers
  CC [M]  /tmp/vcam/vcam.mod.o
  LD [M]  /tmp/vcam/vcam.ko
make[1]: Leaving directory '/home/hank/linux2023/virtme/linux'
cc -O2 -Wall -Wextra -pedantic -std=c99 -o vcam-util vcam-util.c

成功通過

隨後將 vcam.ko 架設上,並開始測試

root@(none):/tmp/vcam# insmod vcam.ko
[65600.023786] vcam: loading out-of-tree module taints kernel.
[65600.026288] Console: switching to colour frame buffer device 80x30
root@(none):/tmp/vcam# lsmod
Module                  Size  Used by
vcam                   28672  1
videobuf2_vmalloc      16384  1 vcam
videobuf2_memops       16384  1 videobuf2_vmalloc
videobuf2_v4l2         36864  1 vcam
videobuf2_common       65536  4 videobuf2_vmalloc,vcam,videobuf2_v4l2,videobuf2_memops
root@(none):/tmp/vcam# ./vcam-util -l
Available virtual V4L2 compatible devices:
1. fb0(640,480,1/1,rgb24) -> /dev/video0

kmemleak 的使用與架設

執行 # mount -t debugfs nodev /sys/kernel/debug/ 後,利用 mount | grep "debug" 確認

root@(none):/# mount | grep "debug"
debugfs on /sys/kernel/debug type debugfs (rw,relatime)

確認已成功裝上