qemu翻譯和執行流程分析
一.qemu簡介
qemu是使用動態二進位制翻譯的cpu模擬器,它支援兩種執行模式:全系統模擬和使用者態模擬。在全系統模擬下,qemu可以模擬處理器和各種外設,可以執行作業系統。使用者態可以執行為另外一種cpu編譯的程序,前提是兩者執行的os要一致。qemu使用了動態二進位制翻譯將target
instruction翻譯成host instruction,完成這個工作的是tcg模組。為了移植性和通用性方面的考慮,qemu定義了mirco-op,本文也稱為中間程式碼,首先qemu會將targetinstruction翻譯成mirco-op,然後tcg將mirco-op翻譯成
Qemu程式碼翻譯流程:target instruction ->micro-op->host instruction
2.qemu程式碼執行流程:
1. 這部分主要是建立了一個為執行tcg翻譯和執行的執行緒,它的函式是qemu_tcg_cpu_thread_fn,這個函式會呼叫tcg_exec_all,最後cpu_exec.
maincpu_init
qemu_init_vcpu
qemu_tcg_init_vcpu
qemu_tcg_cpu_thread_fn
2.執行主函式(cpu_exec)
主要是處理中斷異常, 找到程式碼翻譯塊,然後執行.
- for(;;) {
- process interruptrequest;
- tb_find_fast();
- tcg_qemu_tb_exec(tc_ptr);
- }
qemu會將翻譯好到程式碼塊暫存起來,因此首先會去檢視該pc對應的程式碼是否已經翻譯,如果已經存在直接返回,否則就進入tb_find_slow,進行翻譯。
-
139 staticinline TranslationBlock *tb_find_fast(CPUArchState *env)
- 140 {
- 141 TranslationBlock *tb;
- 142 target_ulong cs_base, pc;
- 143 int flags;
- 144
- 145 /* we record a subset of the CPU state. It will
- 146 always be the same before a given translated block
- 147 is executed. */
- 148 cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
- 149 tb = env->tb_jmp_cache[tb_jmp_cache_hash_func(pc)];
- 150 if (unlikely(!tb || tb->pc != pc || tb->cs_base != cs_base ||
- 151 tb->flags != flags)) {
- 152 tb = tb_find_slow(env, pc, cs_base, flags);
- 153 }
- 154 return tb;
- 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,這樣就可以翻譯接下來的指令。
- 1029 TranslationBlock *tb_gen_code(CPUArchState *env,
- 1030 target_ulong pc, target_ulong cs_base,
- 1031 int flags, int cflags)
- 1032 {
- 1033 TranslationBlock *tb;
- 1034 uint8_t *tc_ptr;
- 1035 tb_page_addr_t phys_pc, phys_page2;
- 1036 target_ulong virt_page2;
- 1037 int code_gen_size;
- 1038
- 1039 phys_pc = get_page_addr_code(env, pc);
- 1040 tb = tb_alloc(pc);
- 1041 if (!tb) {
- 1042 /* flush must be done */
- 1043 tb_flush(env);
- 1044 /* cannot fail at this point */
- 1045 tb = tb_alloc(pc);
- 1046 /* Don't forget to invalidate previous TB info. */
- 1047 tb_invalidated_flag = 1;
- 1048 }
- 1049 tc_ptr = code_gen_ptr;
- 1050 tb->tc_ptr = tc_ptr;
- 1051 tb->cs_base = cs_base;
- 1052 tb->flags = flags;
-
相關推薦
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