1. 程式人生 > >qemu翻譯和執行流程分析

qemu翻譯和執行流程分析

一.qemu簡介

         qemu是使用動態二進位制翻譯的cpu模擬器,它支援兩種執行模式:全系統模擬和使用者態模擬。在全系統模擬下,qemu可以模擬處理器和各種外設,可以執行作業系統。使用者態可以執行為另外一種cpu編譯的程序,前提是兩者執行的os要一致。qemu使用了動態二進位制翻譯將target instruction翻譯成host instruction,完成這個工作的是tcg模組。為了移植性和通用性方面的考慮,qemu定義了mirco-op,本文也稱為中間程式碼,首先qemu會將targetinstruction翻譯成mirco-op,然後tcgmirco-op翻譯成

host instruction

Qemu程式碼翻譯流程:target instruction ->micro-op->host instruction

2.qemu程式碼執行流程:

    1. 這部分主要是建立了一個為執行tcg翻譯和執行的執行緒,它的函式是qemu_tcg_cpu_thread_fn,這個函式會呼叫tcg_exec_all,最後cpu_exec.

main
cpu_init
qemu_init_vcpu
qemu_tcg_init_vcpu

qemu_tcg_cpu_thread_fn

     2.執行主函式(cpu_exec)

                主要是處理中斷異常, 找到程式碼翻譯塊,然後執行.

  1. for(;;) {  
  2. process interruptrequest;  
  3. tb_find_fast();  
  4. tcg_qemu_tb_exec(tc_ptr);  
  5. }  

        qemu會將翻譯好到程式碼塊暫存起來,因此首先會去檢視該pc對應的程式碼是否已經翻譯,如果已經存在直接返回,否則就進入tb_find_slow,進行翻譯。

  1. 139 staticinline TranslationBlock *tb_find_fast(CPUArchState *env)  
  2. 140 {  
  3. 141     TranslationBlock *tb;  
  4. 142     target_ulong cs_base, pc;  
  5. 143     int flags;  
  6. 144   
  7. 145     /* we record a subset of the CPU state. It will 
  8. 146        always be the same before a given translated block 
  9. 147        is executed. */
  10. 148     cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);  
  11. 149     tb = env->tb_jmp_cache[tb_jmp_cache_hash_func(pc)];  
  12. 150     if (unlikely(!tb || tb->pc != pc || tb->cs_base != cs_base ||  
  13. 151                  tb->flags != flags)) {  
  14. 152         tb = tb_find_slow(env, pc, cs_base, flags);  
  15. 153     }  
  16. 154     return tb;  
  17. 155 }  

       進入tb_find_slow後會呼叫tb_gen_code(exec.c),首先分配TranslationBlock描述符,如果TB塊滿了,則會重新整理所有TB塊,在這裡會看到code cache的起始地址是code_gen_buffer,然後再進行分配,分配之後就要填充資訊,主要有所翻譯的指令虛擬地址pc,該tb所對應的翻譯成的程式碼塊起始地址code_gen_ptr,客戶機系統狀態flags。儲存完基本資訊之後,就會呼叫cpu_gen_code(translate-all.c),這個函式完成程式碼翻譯工作。qemu將翻譯好的程式碼存在一個緩衝區裡面。cpu_gen_code這個函式完成之後,需要更新code_gen_ptr,這樣就可以翻譯接下來的指令。

  1. 1029 TranslationBlock *tb_gen_code(CPUArchState *env,  
  2. 1030                               target_ulong pc, target_ulong cs_base,  
  3. 1031                               int flags, int cflags)  
  4. 1032 {            
  5. 1033     TranslationBlock *tb;  
  6. 1034     uint8_t *tc_ptr;  
  7. 1035     tb_page_addr_t phys_pc, phys_page2;  
  8. 1036     target_ulong virt_page2;  
  9. 1037     int code_gen_size;  
  10. 1038      
  11. 1039     phys_pc = get_page_addr_code(env, pc);  
  12. 1040     tb = tb_alloc(pc);  
  13. 1041     if (!tb) {  
  14. 1042         /* flush must be done */
  15. 1043         tb_flush(env);  
  16. 1044         /* cannot fail at this point */
  1. 1045         tb = tb_alloc(pc);  
  2. 1046         /* Don't forget to invalidate previous TB info.  */
  3. 1047         tb_invalidated_flag = 1;  
  4. 1048     }  
  5. 1049     tc_ptr = code_gen_ptr;  
  6. 1050     tb->tc_ptr = tc_ptr;  
  7. 1051     tb->cs_base = cs_base;  
  8. 1052     tb->flags = flags;  
  9. 相關推薦

    qemu翻譯執行流程分析

    一.qemu簡介          qemu是使用動態二進位制翻譯的cpu模擬器,它支援兩種執行模式:全系統模擬和使用者態模擬。在全系統模擬下,qemu可以模擬處理器和各種外設,可以執行作業系統。使用者態可以執行為另外一種cpu編譯的程序,前提是兩者執行的os要一致

    Java多執行緒總結(6)— 執行緒池的基本使用執行流程分析

    1 執行緒池的實現原理及基本類結構   合理利用執行緒池能夠帶來三個好處。 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。 提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。 提高執行緒的可管理性。執行緒是稀缺

    qemu 二進位制翻譯 執行流程分析

    一.qemu簡介          qemu是使用動態二進位制翻譯的cpu模擬器,它支援兩種執行模式:全系統模擬和使用者態模擬。在全系統模擬下,qemu可以模擬處理器和各種外設,可以執行作業系統。使用者態可以執行為另外一種cpu編譯的程序,前提是兩者執行的os要

    深入淺出Mybatis系列(十)---SQL執行流程分析(源碼篇)(轉)

    factor demo 讀取配置 gist wrapper load 任性 wrap 深入淺出 轉載自:http://www.cnblogs.com/dongying/p/4142476.html 1. SqlSessionFactory 與 SqlSession.   通

    MFC 程序入口執行流程

    我們 參數初始化 windows 浪費 對象 ont spa 疑惑 簡單 MFC(微軟基礎類庫)以C++類的形式封裝了Windows API,給開發者提供了便利,但是初學者常常會疑惑MFC程序的入口在哪裏?下面給大家簡單介紹一下MFC 程序入口和執行流程。 一 MFC程序執

    Spark(六)Spark任務提交方式執行流程

    sla handles 解析 nod 就會 clust 它的 管理機 nag 一、Spark中的基本概念 (1)Application:表示你的應用程序 (2)Driver:表示main()函數,創建SparkContext。由SparkContext負責與Cluste

    SpringMVC基本概念執行流程

        基本概念:   MVC:一種架構模式,包括模型層(需要哪些資料)、檢視層(如何展現)、控制層(呼叫哪些業務邏輯)。業務資料的抽取與業務資料的呈現相分離。   DispatcherServlet:前端控制器,負責接收使用者請求,分發到合適的cont

    K8S 原始碼探祕 之 kubeadm upgrade apply 執行流程分析

    一、引言        本文將基於 Kubernetes 1.12 版本,分析 kubeadm  upgrade apply 的執行流程,希望對讀者理解 k8s 有幫助!        關

    K8S 原始碼探祕 之 kubeadm join 執行流程分析

    一、引言        本文將基於 Kubernetes 1.12 版本,分析 kubeadm  join 的執行流程,希望對讀者理解 k8s 有幫助!        關於 init 流程

    K8S 原始碼探祕 之 kubeadm init 執行流程分析

    一、引言        kubeadm 是 k8s 重要的快速部署工具,也是其原生支援的部署工具,在實現自動化部署方面具有重要的研究價值。        本文將基於 Kubernetes 1.12 版本,分析

    1.zookeeper基礎知識,結構執行流程

    zookeeper基礎知識 1.單個zookeeper結構 zookeeper結構圖 每個節點都為znode znode分為持久節點(客戶端斷開連線後,仍然存在),臨時節點(斷開連線,節點消失,不允許有子節點),順序節點(持久或臨時,編號用於鎖定和同步中)

    【WEB 三大核心 Servlet Filter Listener 的生命週期 執行流程

    1. Servlet 的 生命週期 和 執行流程 1.1 Servlet 的執行流程 1. 客戶端傳送請求 (以 GET 或者 Post 方式傳送請求 ) 超連結 : <a href="servl

    Glide原理之執行流程分析

    Glide是一個優秀的圖片載入庫,它有如下優點: 1. Glide可以監聽Activity的生命週期管理,更加合理的管理圖片的載入和釋放。 2. 載入質量,Picasso預設採用的ARGB-8888, Glide預設採用的是RGB-565,記憶體佔用會減小一半。 3. Glide可

    MFC 程式入口執行流程

    一 MFC程式執行過程剖析 1)我們知道在WIN32API程式當中,程式的入口為WinMain函式,在這個函式當中我們完成註冊視窗類,建立視窗,進入訊息迴圈,最後由作業系統根據傳送到程式視窗的訊息呼叫程式的視窗函式。而在MFC程式當中我們不在能找到類似WinMain這樣的程式入口,取而代之的是一

    servlet生命週期執行流程

    一 、生命週期 servlet 宣告週期可以分四個階段: 類裝載過程 init() 初始化過程 service() 服務過程,選擇doGet \ doPost destroy() 銷燬過程 servlet介面如下 public interface Servlet {

    Spring Security 案例實現執行流程剖析

    線上演示 演示地址:http://139.196.87.48:9002/kitty 使用者名稱:admin 密碼:admin Spring Security Spring Security 是 Spring 社群的一個頂級專案,也是 Spring Boot 官方推薦使用的安全框架。除了常規的認證(Au

    深入淺出Mybatis---SQL執行流程分析(原始碼篇)

    最近太忙了,一直沒時間繼續更新部落格,今天忙裡偷閒繼續我的Mybatis學習之旅。在前九篇中,介紹了mybatis的配置以及使用, 那麼本篇將走進mybatis的原始碼,分析mybatis 的執行流程, 好啦,鄙人不喜歡口水話,還是直接上幹活吧: 1. SqlSessionFactory 與 S

    Spring Security Oauth2 單點登入案例實現執行流程剖析

    線上演示 演示地址:http://139.196.87.48:9002/kitty 使用者名稱:admin 密碼:admin Spring Security Oauth2 OAuth是一個關於授權的開放網路標準,在全世界得到的廣泛的應用,目前是2.0的版本。OAuth2在“客戶端”與“服務提供商”之間

    java開發流程(手動建立執行流程

    JDK : java 開發工具和環境 javac 命令 作用是把原始檔(.java)編譯(翻譯)成位元組碼檔案(.class) java 命令 作用是執行一個java程式 開發java程式的步驟(手動建立) :

    linux定位應用問題的一些常用命令,特別針對記憶體執行分析的dump命令

    1.jps找出程序號,找到對應的程序號後面才好繼續操作 2.linux檢視程序詳細資訊     ps -ef | grep 程序ID   3. dump記憶體資訊     Jmap -dump:format=b,file=YYMMddhhmm