在qemu中执行块的时间

时间:2017-04-06 10:17:31

标签: timestamp qemu

我想问一个关于在QEMU中执行翻译块时获取时间信息的问题

实际上我正在使用这个功能

qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);

但我不确定它是否返回在来宾处理器中执行翻译块的时间。

有人可以给我一些提示吗?

感谢名单

1 个答案:

答案 0 :(得分:4)

非KVM,soft-mmu qemu !!!:

qemu_clock_get_ns(QEMUClockType类型)表示指定qemu参考时钟的经过纳秒。有几个参考时钟: QEMU_CLOCK_VIRTUAL是由qemu主循环显式驱动的计数器:该时钟的一个刻度是模拟的时间量(纳秒)。

<强>详细信息: QEMU假设:

1 guest instruction counter tick = 1 emulated nano second << icount_time_shift

icount_time_shift 由“-icount”命令行选项指定,默认为3。

所有qemu计时器都作为截止日期(QEMU_CLOCK_VIRTUAL单位)实现,qemu执行从一个截止日期到另一个截止日期的翻译块。从ns到icount的直接对话提供了厌恶的tb生成:QEMU主循环根据在转换块/链上执行的指令数量来提前计时(参见cpu_exec.c,这里是抽象伪代码):

cpu_exec(CPUState env):

  # jump here if any synchronous exception occurs: page fault, protection and etc
  if(setjmp(env) == exeption) 
      ;#fall through

  for(;;):
    # if exception/interrupt is pending then handle it here
    take_exception_or_interrupt();

    while(no_interrupts()) {
        # get num instructions that left till next deadline
        icount_extra = get_icount_limit();

        # find/generate tb accordnace to icount_extra
        # Also every instruction that access to IO is the last instruction at block.
        # if  access to IO cause interrupt we handle it on next iteration
        tb = find_tb(env, icount_extra);

        # execute tb or tb chain
        execute(env, tb);

        # increment QEMU_CLOCK_VIRTUAL accordance to guest instructions was executed
        # (syncronise with iothread)
        update_clock(tb.executed_instr);
        # we will take all interrupts at next iteration 

QEMU_CLOCK_VIRTUAL提供的间隔用于所有型号的客户定时器/计数器:例如,如果您将电路板系统计数器频率设置为62 MHz,则qemu每16个QEMU_CLOCK_VIRTUAL增量执行该计数器的单个增量。

然后您可以使用qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)在您的客人模型中获取模拟的纳秒间隔。