2009年1月5日月曜日

main_loop

QEMU の基本構造は (vl.c)

int main() {
   オプション解析や初期化など。
   main_loop();
}

main_loop() {
  for(;;) {
    if(実行中) {

      for(;;) {
        ret = cpu_exec(); /* Basic Block 実行 */
        if(割り込みがあった) {
           ret = EXCP_INTERRUPT;
           break;
        }
     }

      if(ret == EXCP_HALTED)
        timeout = 10;
      else
         timeout = 0;

      main_loop_wait(timeout);
    }
  }
}

らしい。基本ブロックを実行して main_loop_wait() して、の繰り返し。

cpu_exec(env) {
  if(BB キャッシュあり) {
    そのまま実行 (機械語列に制御を渡す)
  } else {
    BB を JIT して、キャッシュしておく。
  }
}

main_loop_wait() {
    
  /* XXX: need to suppress polling by better using win32 events */
  ret = 0;
  for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
      ret |= pe->func(pe->opaque);
  }

#ifdef _WIN32
  if(ret == 0) {
    ret = WaitForMultipleObjects(....., timeout);
#endif
}

timeout が 0 の場合、条件を調べて即制御を返す。

0 件のコメント:

コメントを投稿