当前位置: 首页 > news >正文

qemu源码解析【06】qemu启动初始化流程

目录

  • qemu源码解析【06】qemu启动初始化流程
    • 2.4 (书接上文)处理解析出来的参数结果
    • 2.5 初始化main loop
    • 2.6 杂项
    • 2.7 创建machine
      • 2.7.1 new一个machine类型出来
      • 2.7.2 设置memory page size

qemu源码解析【06】qemu启动初始化流程

  • qemu源码解析【总目录】

2.4 (书接上文)处理解析出来的参数结果

    // 验证参数正确性,看起来是linux启动内核相关的参数,我不做linux所以不太熟qemu_validate_options(machine_opts_dict);// smp,cpus这类参数qemu_process_sugar_options();// 影响全局的一些参数,提前处理qemu_process_early_options();// 处理帮助命令qemu_process_help_options();// daemonize进程相关qemu_maybe_daemonize(pid_file);// 初始化日志文件trace_init_file();

2.5 初始化main loop

  • qemu_init_main_loop()函数位于util/main-loop.c文件中,主要是注册aio相关配置,这又是一个大的概念,后面单开一篇娓娓道来:
int qemu_init_main_loop(Error **errp)
{int ret;GSource *src;init_clocks(qemu_timer_notify_cb);ret = qemu_signal_init(errp);if (ret) {return ret;}qemu_aio_context = aio_context_new(errp);if (!qemu_aio_context) {return -EMFILE;}qemu_set_current_aio_context(qemu_aio_context);qemu_notify_bh = qemu_bh_new(notify_event_cb, NULL);gpollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD));src = aio_get_g_source(qemu_aio_context);g_source_set_name(src, "aio-context");g_source_attach(src, NULL);g_source_unref(src);src = iohandler_get_g_source();g_source_set_name(src, "io-handler");g_source_attach(src, NULL);g_source_unref(src);return 0;
}

2.6 杂项

    // 初始化定时器cpu_timers_init();user_register_global_props();replay_configure(icount_opts);// 配置rtc,real time clock,具体实现位于/system/rtc.c中// 可以选用host系统时钟,或者虚拟时钟,app创建timer会用到这个时钟configure_rtc(qemu_find_opts_singleton("rtc"));// 解析目标机的内存参数parse_memory_options();

2.7 创建machine

  • 这里内容太多了,分细节写

2.7.1 new一个machine类型出来

    current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));
  • 这里看代码不方便,直接vscode上调试神器gdb,使用方法和参数见本系列第一章
  • 直接断点打到vl.c/qemu_create_machine
    在这里插入图片描述
  • 在经历下图的调用堆栈之后,最后create machine进入hw/arm/virt.c中的virt_instance_init()函数,没毛病,因为我们machine参数指定的就是-M virt这个machine
    在这里插入图片描述

2.7.2 设置memory page size

  • 搞过驱动的都知道,为了系统效率,系统分配内存有个最小粒度,哪怕你只分1个字节,都要对齐到这个最小粒度上
  • 所以这里也在设置系统的内存粒度,我的主机上page size是4kb,对应的page bits就是12,4kb=2^12
    在这里插入图片描述

http://www.mrgr.cn/news/81016.html

相关文章:

  • 数据倾斜的原因以及解决方法
  • object-c 2.0入门笔记
  • 前端篇-Content-Type 详解
  • 设计模式-访问者设计模式
  • windows C#-构造函数
  • C++ 特殊类的设计
  • Ubuntu 22.04,Rime / luna_pinyin.schema 输入法:外挂词库,自定义词库 (****) OK
  • Docker 入门:如何使用 Docker 容器化 AI 项目(一)
  • ubuntu 安装更新 ollama新版本
  • CAD xy坐标标注(跟随鼠标位置实时移动)——C#插件实现
  • 备忘一个FDBatchMove数据转存的问题
  • 分析excel硕士序列数据提示词——包含对特征的筛选,非0值的过滤
  • Halcon单相机+机器人=眼在手上#标定心得
  • SQL进阶技巧:如何计算商品需求与到货队列表进出计划?
  • Linux Shell 脚本编程基础知识篇(一)
  • Restaurants WebAPI(三)——Serilog/FluenValidation
  • Jenkins
  • lc148链表排序——链表版归并排序
  • AI的进阶之路:从机器学习到深度学习的演变(二)
  • 【老白学 Java】泛型应用 - 卡拉 OK(四)
  • git merge 冲突 解决 show case
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.2,RTP协议-RTP协议概述,协议详情
  • JS数组方法汇总
  • 【算法】编程拓展-C语言-期末复习
  • 代码随想录算法训练营第十一天-239.滑动窗口最大值
  • 基于pytorch的深度学习基础3——模型创建与nn.Module