QEMU-System mode emulation分析(1)

1. 运行主流程简单分析

在该模式下,qemu除了模拟cpu运行。还要管理、模拟外围设备,因此系统模式模拟比用户模式模拟多出非常多须要我们关心的地方,比方。机器管理。设备管理,总线模拟,中断模拟,mmu模拟,以及它们是怎样协同工作的等等。本节主要简单分析下qemu系统模式的运行主流程。例如以下图所看到的:


上图主要描写叙述整个模拟器运行过程的大体框架,由图可知,main_loop是模拟器运行时的主循环,cpu_exec_all()函数是用来运行cpu指令。main_loop_wait是用来运行外围设备模拟代码,当然这些并非全然绝对的,比方cpu在对io设备的地址空间进行load/store操作时,就会调用io设备读写handler。


那cpu_exec_all函数的运行流程又是怎么样的呢?例如以下图:

由上图可知。在函数cpu_exec_all中。会去遍历和执行每一个cpu,然后去调用qemu_cpu_exec函数,最后去调用cpu_exec函数。cpu_exec函数分析在前文的用户模式已经分析过。代码翻译、代码执行、异常产生都在那边完毕,具体分析參考前文。

接下来,分析下main_loop_wait函数,该函数最基本的功能是响应外围输入,以及处理timer事件。见下图。该图是main_loop_wait运行的整体过程。这个过程中不断地去监听相应的host设备是否有输入输出,若有,则调用相应的回调函数去处理。

最后去扫描下全部的qemu_timer,若设定时间已经到达,则运行相应钩子函数进行处理。

详细关于qemu_timer的实现机制和用法。会在后面有所介绍
.


分析到这里,你是否有个疑问。当cpu运行引擎在运行cpu指令的时候,它怎样响应外围设备的输入?alarm信号,qemu会依据qemu_timer链表里面的信息动态地设置下次发生alarm信号的时间,然后在signal_handler中断开tb链。并设置退出标志。从而中断cpu的运行,使qemu去处理外围的输入和timer事件的处理函数。从而实现外围设备的模拟和同步。这里也涉及到了qemu_timer,以后会有具体介绍它的实现机制。



原文地址:https://www.cnblogs.com/wgwyanfs/p/7116008.html