前言
最近,由于公司将qemu从410升级到620。我们对qemu的一些功能定制也需要和入到620版本。其中我负责的usb外设这部分功能,也需要和入,涉及到620的初始化流程修改,在这里作简单记录。
说明
代码路径
- 我们的功能代码存放在hw/usb目录下。这里我们以redirect.c作为分析目标
和410的区别
以前这个目录下的代码,是直接编译到qemu-kvm中的。620中qemu引入了模块化机制,hw 目录下的功能,都编译成so模式,在参数解析到对应功能时,才动态加载对应的so库。极大的减小了qemu-kvm的运行时内存。
620放弃了以前的automake的编译方式,更换了基于python的meson编译方式
模块加载分析
函数图
flowchart LR qemu_init --> module_init_info qemu_init --> module_init_info
配置转换图
flowchart LR */meson.build --/configure--> build/build.ninja build/build.ninja --scripts/modinfo-collect.py--> build/xxxx.modinfo build/xxxx.modinfo --scripts/modinfo-generate.py--> build/modinfo.c
qemu_init
- qemu初始化函数,算是qemu的入口函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22void qemu_init(int argc, char **argv, char **envp)
{
//...
module_init_info(qemu_modinfo);
module_allow_arch(TARGET_NAME);
//...
for(;;) {
if (optind >= argc)
break;
if (argv[optind][0] != '-') {
loc_set_cmdline(argv, optind, 1);
drive_add(IF_DEFAULT, 0, argv[optind++], HD_OPTS);
} else {
const QEMUOption *popt;
//...
}
//...
}
//...
} - module_init_info 用来初始化 qemu_modinfo 这个全局变量
meson.build
1 | ######################## |
- 其中 usbparse uvccli avcodec avdevice avfilter avformat avutil swresample postproc swscale 是我们需要使用的依赖库
scripts/modinfo-collect.py
- 用来生成build/xxxx.modinfo文件
scripts/modinfo-generate.py
- 用来生成build/modinfo.c 文件
build/build.ninja
- 通过configure操作,生成的ninja配置文件
- 已知依赖 meson.build
meson.build
hw/usb/meson.build
- 以下是我添加的配置
- uvccli usbparse 是在meson.build中定义的两个模块,这里可以直接引入
- ksvdredir_ss 是定义的资源,仅在本文件使用
- hw_usb_modules 是要生成的目标模块表,这里新加入了一个ksvdredirect的模块,最终会生成hw-usb-ksvdredirect.so
- 这里我只对uvccli作了判断,其实更合理的做法是对所有依赖库都判断一次
1 | if uvccli.found() |
参考文献
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2023/05/25/it/linux/qemu/qemu620-init/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!