我想问一个关于在QEMU中执行翻译块时获取时间信息的问题
实际上我正在使用这个功能
qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
但我不确定它是否返回在来宾处理器中执行翻译块的时间。
有人可以给我一些提示吗?
感谢名单
答案 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)在您的客人模型中获取模拟的纳秒间隔。