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,以后会有详细介绍它的实现机制。
版权声明:本文为博主原创文章,未经博主允许不得转载。