(undone) 解析 qemu-6.0.0 源码 (4) 添加 niubi board

添加 niubi board

根据上一节,已知 -M help 代码执行在:

复制代码
qemu-6.0.0/softmmu/vl.c : machine_parse

我们看看源码:

c 复制代码
static MachineClass *machine_parse(const char *name, GSList *machines)
{
    MachineClass *mc;
    GSList *el;

    if (is_help_option(name)) {
        printf("Supported machines are:\n");
        printf("yoooooo!!!\n");
        machines = g_slist_sort(machines, machine_class_cmp);
        for (el = machines; el; el = el->next) {
            MachineClass *mc = el->data;
            if (mc->alias) {
                printf("%-20s %s (alias of %s)\n", mc->alias, mc->desc, mc->name);
            }
            printf("%-20s %s%s%s\n", mc->name, mc->desc,
                   mc->is_default ? " (default)" : "",
                   mc->deprecation_reason ? " (deprecated)" : "");
        }
        exit(0);
    }

    mc = find_machine(name, machines);
    if (!mc) {
        error_report("unsupported machine type");
        error_printf("Use -machine help to list supported machines\n");
        exit(1);
    }
    return mc;
}

连蒙带猜,这个参数 name 应该就是跟在选项 -M 后边的东西。

is_help_option 就是判断 name == "help" 是否成立

如果成立,就打印 Supported machine list

不成立,找到 name 所指的机器,存到变量 mc 里,然后返回 mc (mc 类型是 MachineClass)

阅读源码,很容易发现 Supported machine list 是存放在第二个参数 machines 里的。

在上一节,我们知道调用 machine_parse 的调用栈是:

复制代码
#0  machine_parse (machines=0x5555566143a0 = {...}, name=0x55555647fde0 "help") at ../softmmu/vl.c:1540
#1  select_machine () at ../softmmu/vl.c:1630
#2  qemu_init (argc=argc@entry=3, argv=argv@entry=0x7fffffffde28, envp=envp@entry=0x7fffffffde48) at ../softmmu/vl.c:3546
#3  0x000055555581044b in main (argc=3, argv=0x7fffffffde28, envp=0x7fffffffde48) at ../softmmu/main.c:50

往上追溯,看 vl.c : select_macine 函数:

c 复制代码
static MachineClass *select_machine(void)
{
    GSList *machines = object_class_get_list(TYPE_MACHINE, false);
    ...

会发现 machines 列表是 object_class_get_list 函数返回的。

深入下去看 object_class_get_list 的实现,会发现功能是 "遍历 QOM 全局注册的类型哈希表,把所有满足过滤条件的 ObjectClass 收集成一个单链表 GSList 返回"。

这个过滤参数就在参数上,TYPE_MACHINE 是类型过滤条件,false 表示不包含抽象类。

深入读下去,会发现包含各个板子硬件类型的 QOM 已经初始化好了。object_class_get_list 并没有初始化这些板子,而是把已经初始化完毕的 QOM 按照过滤条件收集起来,变成一个单链表返回。

说明板子硬件类型的 QOM 初始化发生在更早阶段。

相关推荐
flyingonpine11 小时前
PowerShell脚本数字签名实战:自签名证书、代码签名与信任链验证
windows·信任链
goehou17 小时前
让 AI 替我操作这台电脑,先把手能伸多远定下来
windows·自动化·权限管理·ai agent
公子小六18 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
2601_967987371 天前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
xbzb2 天前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
武雄(小星Ai)2 天前
Ollama报llama-server binary not found排坑实录:服务活着引擎没了
人工智能·windows·大模型·ollama·排坑
叼烟扛炮2 天前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
Thneonl3 天前
桌宠穿透不是一行 SetWindowLong
windows·程序员
艺杯羹3 天前
Windows原生软件锁设计:从暴力杀进程丢数据到零轮询事件驱动架构
windows·系统架构·开源·开源软件·内存管理·开源协议
csdn_aspnet4 天前
Redis 入门:Windows、Mac安装指南
数据库·windows·redis·缓存·mac