1. 程式人生 > >qemu原始碼分析之五-- TCG動態翻譯技術

qemu原始碼分析之五-- TCG動態翻譯技術

1. TCG簡單介紹

TCG(Tiny Code Generator)最早被用於C編譯器的後端。在TCG相關的程式碼中,target指的是我們通常說的host,這一點需要注意,並不是我們理解的被模擬的平臺。

2. TCG動態翻譯技術的幾個概念

(1)與dyngen一樣,TCG的“function”與qemu的TBs(Translated Block)相對應,即以分支跳轉指令結束的程式碼段。

(2)TCG中有三種變數:temporary, local temporary, global。這三種變數有著不同的生命週期,temporary變數的宣告週期是TBs,local temporary變數的宣告週期是functions,global變數的宣告週期是所有的functions,類似C語言的全域性變數。temporary和local temporary變數通常在function內定義,global變數通常在function外定義。全域性變數通常被對映到某個記憶體地址或某個固定的暫存器。

3. TCG operations

就像dyngen動態翻譯技術中的micro-operations一樣,TCG也採用中間表示的形式(TCG instructions),TCG至中間表示支援的三種變數有兩種資料型別:32 bit整型和64 bit整型。另外,指標型別被實現為整型的別名。

TCG指令有固定的形式:

TCG 操作碼 輸出變數域,輸入變數域,常量域

比較特殊的是call指令,其後只跟一個變數,同時作為輸出和輸入變數域。

舉個例子:

add_i32 t0, t1, t2 (t0 <- t1 + t2)

操作碼 輸出變數域 輸入變數域 常量域(輸入)

4. TCG是qemu的核心,主要實現了以下翻譯流程:

guest binary instructions -> TCG IR -> host binary instructions TCG 定義了一組IR(intermediate representation),這些IR大致可以分為以下幾類: - Mov類操作: mov, movi, ... - 邏輯操作: and, or, xor, shl, shr, ... - 算術操作: add, sub, mul, div, ... - 分支跳轉操作: jmp, br, brcond - 函式呼叫: call - 記憶體操作: ld, st - QEMU的特殊操作: tb_exit, goto_tb, qemu_ld/qemu_st 這裡僅對TCG中間表示做一下簡單分類,至於每條TCG指令的具體用法,參見qemu原始碼tcg/readme。 5. TCG 動態翻譯過程 前面也提到TCG主要實現以下翻譯過程: guest binary instructions -> TCG IR -> host binary instructions 在qemu原始碼中,target-ARCH/* 定義瞭如何將guest binary instructions 反彙編成 TCG IR,tcg/ARCH 定義瞭如何將 TCG IR 翻譯成 host binary instructions。

在下一篇文章中,將會從qemu原始碼的角度詳細分析x86-->x86平臺的TCG動態翻譯技術的執行過程。

相關推薦

qemu原始碼分析-- TCG動態翻譯技術

1. TCG簡單介紹 TCG(Tiny Code Generator)最早被用於C編譯器的後端。在TCG相關的程式碼中,target指的是我們通常說的host,這一點需要注意,並不是我們理解的被模擬的平臺。 2. TCG動態翻譯技術的幾個概念 (1)與dyngen一樣,TCG的“function”與qem

qemu原始碼分析四--dyngen動態翻譯技術

    由於剛剛接觸qemu,所以前面幾篇文章僅僅是膚淺的介紹qemu的一些背景知識,今天突然感覺前面說的太沒有條理了,而且大部分是讀別人的文章,一知半解,沒有自己的總結體會,今天感覺稍微有點心得,敬請指教。 1. 明確guest和host     對於qemu而言,被模擬

qemu-TCG動態翻譯技術

1. TCG簡單介紹    TCG(Tiny Code Generator)最早被用於C編譯器的後端。在TCG相關的程式碼中,target指的是我們通常說的host,這一點需要注意,並不是我們理解的被模擬的平臺。 2. TCG動態翻譯技術的幾個概念 (1)與dyng

netty原始碼分析 transport(ChannelHandler)

上文說到了,channelHandler, 顧名思義 handler 處理者 從channelPipeline的定義中看出,channelPipeline是channelHandler的集合 public interface ChannelPipeline extends

關於qemu的二三事(5)————qemu原始碼分析引數解析

目前,這個qemu的版本號是: [[email protected] x86_64-softmmu]# ./qemu-system-x86_64 --version QEMU emulator version 2.9.50 (v2.9.0-941-g0748

SpringOauth2.0原始碼分析儲存(

1.概述 前面幾個章節所述內容如下: 本章節主要敘說Token的儲存情況。預設的情況下,SpringOauth2.0 提供4種方式儲存。第一種是提供了基於mysql的儲存,第二種是基於redis的儲存。第三種基於jvm的儲存,第四種基於Jwt的儲存方式。這裡我

spring4.2.9 java專案環境下ioc原始碼分析)——refreshobtainFreshBeanFactory方法(@3預設標籤import,alias解析)

接上篇文章,到了具體解析的時候了,具體的分為兩種情況,一種是預設名稱空間的標籤<bean>;另一種是自定義名稱空間的標籤比如<context:xxx>,<tx:xxx>等。先看下預設的名稱空間的標籤解析。protected void par

Spring Cloud原始碼分析Eureka篇第章:更新服務列表

在上一章《Spring Cloud原始碼分析之Eureka篇第四章:服務註冊是如何發起的 》,我們知道了作為Eureka Client的應用啟動時,在com.netflix.discovery.DiscoveryClient類的initScheduledTask

elasticsearch原始碼分析Transport(

一、基本介紹 1.1概念介紹 transport模組是es通訊的基礎模組,在elasticsearch中用的很廣泛,比如叢集node之間的通訊、資料的傳輸、transport client方式的資料傳送等等,只要數和通訊、資料傳輸相關的都離不開transport模組的

dubbo原始碼分析動態編譯

我們執行的Java程式碼,都是編譯之後的位元組碼,dubbo為了實現了基於spi思想的擴充套件特性,特別是能夠靈活新增額外功能。dubbo作為一個高擴充套件性的框架,使的使用者能夠新增自己的需求,根據配置動態生成自己的設配類程式碼,這樣就需要在執行的時候去編譯載

TensorFlow學習筆記——原始碼分析最近演算法

import numpy as np import tensorflow as tf # Import MINST data import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot=

雲客Drupal8原始碼分析實體Entity()內容實體基類

原始碼分析重點在於在自己的大腦中重現開發者的思維過程,內容實體基類是drupal中很大的一個類,她要處理眾多的問題,內容實體的大多數功能都集中在這裡,開發者有許多的考慮,要弄清楚她的所有細節,學習者可能會覺得有些困難,這時需要明白任何複雜龐大的事物都是一步步累積發展起來的,

Java多執行緒ThreadPoolExecutor實現原理和原始碼分析

章節概覽、 1、概述 執行緒池的顧名思義,就是執行緒的一個集合。需要用到執行緒,從集合裡面取出即可。這樣設計主要的作用是優化執行緒的建立和銷燬而造成的資源浪費的情況。Java中的執行緒池的實現主要是JUC下面的ThreadPoolExecutor類完成的。下面

Spring原始碼分析IOC(

前面已經分析ObtainFreshBeanfactory()這個方法是解析和註冊bean,例項化IOC容器的。 重新看一下refresh()方法 @Override public void refresh() throws BeansExcept

容器原始碼分析TreeSet()

HashSet是藉助於HashMap的key不允許重複這個特性來實現的。HashMap是操作鍵值對,而HashSet是操作HashMap的key完成相關操作,TreeSet比HashSet加了排序的功能,那是不是TreeSet也因應該是通過操作TreeMap來實

spark 原始碼分析 -- Spark記憶體管理剖析

本篇文章主要剖析Spark的記憶體管理體系。 在上篇文章 spark 原始碼分析之十四 -- broadcast 是如何實現的?中對儲存相關的內容沒有做過多的剖析,下面計劃先剖析Spark的記憶體機制,進而進入記憶體儲存,最後再剖析磁碟儲存。本篇文章主要剖析記憶體管理機制。 整體介紹 Spar

死磕以太坊原始碼分析EVM動態資料型別

> 死磕以太坊原始碼分析之EVM動態資料型別 > > 配合以下程式碼進行閱讀:https://github.com/blockchainGuide/ > > 寫文不易,給個小關注,有什麼問題可以指出,便於大家交流學習。 > ![image-2021011318550029

Spark原始碼分析Spark Shell(上)

https://www.cnblogs.com/xing901022/p/6412619.html 文中分析的spark版本為apache的spark-2.1.0-bin-hadoop2.7。 bin目錄結構: -rwxr-xr-x. 1 bigdata bigdata 1089 Dec

Flume NG原始碼分析)使用ThriftSource通過RPC方式收集日誌

上一篇說了利用ExecSource從本地日誌檔案非同步的收集日誌,這篇說說採用RPC方式同步收集日誌的方式。筆者對Thrift比較熟悉,所以用ThriftSource來介紹RPC的日誌收集方式。 整體的結構圖如下: 1. ThriftSource包含了一個Thrift Server,以及一個

OpenCV學習筆記(31)KAZE 演算法原理與原始碼分析)KAZE的原始碼優化及與SIFT的比較

  KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構建 3.  Op