qemu vcpu的創建過程

在 QEMU 中,vCPU 線程的啟動流程涉及多個階段,包括初始化、線程創建和執行邏輯。以下是基于搜索結果的詳細分析:

QEMU vCPU 線程的啟動流程

1. 初始化階段

  • 設備實例化:QEMU 使用 QOM(QEMU Object Model)系統進行設備的實例化。CPU 設備也需要通過 type_init() 方法注冊到 QOM 系統中,這樣可以通過 object_new() 創建 CPU 實例。
  • CPU 模型初始化:在 QEMU 啟動時,會根據用戶指定的 CPU 模型類型(通過命令行參數指定)初始化 vCPU 的特性。例如,對于 x86 架構,QEMU 會加載對應的 CPU 模型定義,并設置支持的特性。

2. 線程創建

  • vCPU 線程創建:在 qemu_init_vcpu() 函數中,QEMU 會為每個 vCPU 創建一個線程。這個線程的主體邏輯是在一個大循環中反復執行取指令、翻譯和執行的操作。
  • 線程函數:對于 RISC-V 架構,vCPU 線程的主體函數是 mttcg_cpu_thread_fn,它負責模擬 vCPU 的執行。

3. CPU 狀態配置

  • CPU 復位:在 qemu_init_vcpu() 中,vCPU 的初始狀態被設置為停止狀態(stopped)。在后續的 cpu_reset() 函數中,會調用 riscv_cpu_reset() 來配置 CPU 的初始狀態。
  • 啟動 vCPU:在 CPU 實例化完成后,通過調用 cpu_resume() 將 vCPU 設置為可以運行的狀態。

4. 執行階段

  • 指令執行循環:vCPU 線程進入一個主循環,不斷從虛擬機的內存中取指令、翻譯并執行。如果 CPU 處于停止狀態,線程會等待直到被喚醒。
  • KVM 支持:在使用 KVM 時,QEMU 會通過 KVM 的 ioctl 接口與內核進行交互,以加速 vCPU 的執行。

5. 多核啟動邏輯

  • 主從核協調:在多核虛擬機中,QEMU 會啟動多個 vCPU 線程。主核(通常為第一個 vCPU)會初始化公共資源,而從核(其他 vCPU)可能會通過 WFI(Wait for Interrupt)指令掛起,直到主核通過 IPI(Inter-Processor Interrupt)喚醒它們。
  • 固件與內核啟動:QEMU 在啟動時會加載固件(如 OpenSBI),并通過固件引導內核啟動。內核會通過 SBI 接口下發啟動命令給從核,從而完成多核啟動。

6.小結

QEMU vCPU 線程的啟動流程包括初始化設備、創建線程、配置 CPU 狀態、進入指令執行循環以及多核協調等階段。具體實現涉及多個函數和模塊,如 qemu_init_vcpu()cpu_reset()cpu_resume()。對于 RISC-V 架構,QEMU 使用 mttcg_cpu_thread_fn 作為 vCPU 線程的主體函數。

如果您需要進一步深入研究,可以參考 QEMU 的源碼,特別是 qemu_init_vcpu()cpu_reset() 等函數的實現。

7.tcg解釋器創建過程:

static void tcg_accel_ops_init(AccelOpsClass *ops)
{if (qemu_tcg_mttcg_enabled()) {ops->create_vcpu_thread = mttcg_start_vcpu_thread;ops->kick_vcpu_thread = mttcg_kick_vcpu_thread;ops->handle_interrupt = tcg_handle_interrupt;} else {ops->create_vcpu_thread = rr_start_vcpu_thread;ops->kick_vcpu_thread = rr_kick_vcpu_thread;if (icount_enabled()) {ops->handle_interrupt = icount_handle_interrupt;ops->get_virtual_clock = icount_get;ops->get_elapsed_ticks = icount_get;} else {ops->handle_interrupt = tcg_handle_interrupt;}}ops->cpu_reset_hold = tcg_cpu_reset_hold;ops->supports_guest_debug = tcg_supports_guest_debug;ops->insert_breakpoint = tcg_insert_breakpoint;ops->remove_breakpoint = tcg_remove_breakpoint;ops->remove_all_breakpoints = tcg_remove_all_breakpoints;
}

這段代碼是 QEMU 中與 TCG(Tiny Code Generator)加速器相關的初始化邏輯,用于設置不同加速模式下的虛擬 CPU(vCPU)線程操作函數。以下是對這段代碼的詳細解析和解釋:

7.1. 函數定義
static void tcg_accel_ops_init(AccelOpsClass *ops)
  • tcg_accel_ops_init:這是一個靜態函數,用于初始化 TCG 加速器的操作函數。
  • AccelOpsClass *ops:這是一個指向 AccelOpsClass 結構的指針,該結構定義了加速器的操作接口。
7.2. 多線程 TCG(MTTCG)模式
if (qemu_tcg_mttcg_enabled()) {ops->create_vcpu_thread = mttcg_start_vcpu_thread;ops->kick_vcpu_thread = mttcg_kick_vcpu_thread;ops->handle_interrupt = tcg_handle_interrupt;
}
  • qemu_tcg_mttcg_enabled():檢查是否啟用了多線程 TCG(MTTCG)模式。
    • 如果啟用,ops 的相關操作函數會被設置為 MTTCG 版本。
  • mttcg_start_vcpu_thread:用于啟動 vCPU 線程的函數。
  • mttcg_kick_vcpu_thread:用于喚醒 vCPU 線程的函數。
  • tcg_handle_interrupt:處理中斷的通用函數。
7.3. 單線程 TCG(RR)模式
else {ops->create_vcpu_thread = rr_start_vcpu_thread;ops->kick_vcpu_thread = rr_kick_vcpu_thread;if (icount_enabled()) {ops->handle_interrupt = icount_handle_interrupt;ops->get_virtual_clock = icount_get;ops->get_elapsed_ticks = icount_get;} else {ops->handle_interrupt = tcg_handle_interrupt;}
}
  • rr_start_vcpu_thread:用于啟動 vCPU 線程的函數(單線程模式)。
  • rr_kick_vcpu_thread:用于喚醒 vCPU 線程的函數(單線程模式)。
  • icount_enabled():檢查是否啟用了指令計數模式(Instruction Counting Mode)。
    • 如果啟用,中斷處理和時鐘獲取函數會被設置為指令計數版本。
    • icount_handle_interrupt:處理中斷的指令計數版本。
    • icount_get:獲取虛擬時鐘和已過時鐘的指令計數版本。
    • 如果未啟用指令計數模式,則使用通用的 tcg_handle_interrupt 函數。
7.4. 通用操作
ops->cpu_reset_hold = tcg_cpu_reset_hold;
ops->supports_guest_debug = tcg_supports_guest_debug;
ops->insert_breakpoint = tcg_insert_breakpoint;
ops->remove_breakpoint = tcg_remove_breakpoint;
ops->remove_all_breakpoints = tcg_remove_all_breakpoints;
  • tcg_cpu_reset_hold:用于在 CPU 重置時保持狀態的函數。
  • tcg_supports_guest_debug:檢查是否支持客戶機調試的函數。
  • tcg_insert_breakpoint:插入斷點的函數。
  • tcg_remove_breakpoint:移除斷點的函數。
  • tcg_remove_all_breakpoints:移除所有斷點的函數。
7.5 功能總結

這段代碼的主要功能是根據 QEMU 的配置(MTTCG 或 RR 模式,以及是否啟用指令計數)初始化 TCG 加速器的操作函數。這些操作函數定義了 vCPU 線程的啟動、喚醒、中斷處理以及調試支持等行為。

7.6 關鍵點
  1. MTTCG 模式

    • 啟用多線程 TCG 時,使用 mttcg_start_vcpu_threadmttcg_kick_vcpu_thread
    • 這種模式適合多核系統,可以提高性能。
  2. RR 模式

    • 單線程 TCG 模式,使用 rr_start_vcpu_threadrr_kick_vcpu_thread
    • 適合單核系統或調試場景。
  3. 指令計數模式

    • 如果啟用指令計數,中斷處理和時鐘獲取函數會被設置為指令計數版本。
    • 這種模式用于精確模擬指令執行時間。
  4. 調試支持

    • 提供了斷點插入和移除的功能,支持客戶機調試。

通過這段代碼,QEMU 能夠靈活地根據配置選擇合適的加速模式和操作函數,從而優化虛擬機的性能和調試能力。

8. vcpu 線程建立細節

void mttcg_start_vcpu_thread(CPUState *cpu)
{char thread_name[VCPU_THREAD_NAME_SIZE];g_assert(tcg_enabled());tcg_cpu_init_cflags(cpu, current_machine->smp.max_cpus > 1);/* create a thread per vCPU with TCG (MTTCG) */snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",cpu->cpu_index);qemu_thread_create(cpu->thread, thread_name, mttcg_cpu_thread_fn,cpu, QEMU_THREAD_JOINABLE);
}
qemu_thread_createqemu_thread_startthread_context_class_initthread_context_set_cpu_affinityqemu_thread_set_affinitystatic void thread_context_class_init(ObjectClass *oc, void *data)
{UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);ucc->complete = thread_context_instance_complete;object_class_property_add(oc, "thread-id", "int",thread_context_get_thread_id, NULL, NULL,NULL);object_class_property_add(oc, "cpu-affinity", "int",thread_context_get_cpu_affinity,thread_context_set_cpu_affinity, NULL, NULL);object_class_property_add(oc, "node-affinity", "int", NULL,thread_context_set_node_affinity, NULL, NULL);
}

9. cpu屬性更改 object_class_property_add

在 QEMU 中,object_class_property_add 函數用于為一個對象類添加一個屬性。這個屬性可以被用戶通過 QEMU 的命令行工具(如 qemu-monitor)或 API 訪問和修改。以下是如何使用 object_class_property_add 添加 cpu-affinity 屬性的詳細說明,以及如何通過 QEMU 的機制訪問和修改這個屬性。

9.1. object_class_property_add 函數的參數
object_class_property_add(ObjectClass *oc, const char *name, const char *type,ObjectPropertyAccessor *get,ObjectPropertyAccessor *set,ObjectPropertyRelease *release,void *opaque);
  • oc:指向 ObjectClass 的指針,表示當前正在初始化的類。
  • name:屬性的名稱(例如 "cpu-affinity")。
  • type:屬性的類型(例如 "int" 表示整數)。
  • get:獲取屬性值的回調函數。
  • set:設置屬性值的回調函數。
  • release:釋放屬性值的回調函數(可選)。
  • opaque:用戶數據,傳遞給回調函數(可選)。
9.2. 回調函數

在您的代碼中,cpu-affinity 屬性的 getset 回調函數分別是 thread_context_get_cpu_affinitythread_context_set_cpu_affinity

獲取屬性值的回調函數
static int thread_context_get_cpu_affinity(Object *obj, Error **errp)
{ThreadContext *tc = THREAD_CONTEXT(obj);return tc->cpu_affinity;
}
  • obj:指向對象的指針。
  • errp:用于返回錯誤信息的指針。
  • 返回值:當前的 CPU 親和性值。
設置屬性值的回調函數
static void thread_context_set_cpu_affinity(Object *obj, int value, Error **errp)
{ThreadContext *tc = THREAD_CONTEXT(obj);tc->cpu_affinity = value;
}
  • obj:指向對象的指針。
  • value:要設置的屬性值。
  • errp:用于返回錯誤信息的指針。
9.3. 如何使用 cpu-affinity 屬性
通過 QEMU 命令行工具

假設您已經創建了一個 ThreadContext 對象,并且它被添加到了 QEMU 的對象模型中,您可以通過 QEMU 的命令行工具(如 qemu-monitor)訪問和修改 cpu-affinity 屬性。

  1. 查詢當前的 CPU 親和性

    (qemu) info object <object-name>
    

    這將顯示對象的所有屬性,包括 cpu-affinity

  2. 設置 CPU 親和性

    (qemu) object_property_set <object-name> cpu-affinity=2
    

    這將設置 cpu-affinity 屬性為 2。

通過 QEMU API

您也可以通過 QEMU 的 C API 訪問和修改屬性。

  1. 查詢當前的 CPU 親和性

    int cpu_affinity = object_property_get_int(OBJECT(tc), "cpu-affinity", &error_abort);
    printf("Current CPU affinity: %d\n", cpu_affinity);
    
  2. 設置 CPU 親和性

    object_property_set_int(OBJECT(tc), "cpu-affinity", 2, &error_abort);
    
9.4. 完整示例

以下是一個完整的示例,展示如何定義和使用 cpu-affinity 屬性。

定義 ThreadContext
typedef struct ThreadContext {Object parent_obj;int cpu_affinity;
} ThreadContext;static void thread_context_class_init(ObjectClass *oc, void *data)
{UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);ucc->complete = thread_context_instance_complete;object_class_property_add(oc, "cpu-affinity", "int",thread_context_get_cpu_affinity,thread_context_set_cpu_affinity, NULL, NULL);
}static void thread_context_instance_init(Object *obj)
{ThreadContext *tc = THREAD_CONTEXT(obj);tc->cpu_affinity = 0; // 默認值
}static int thread_context_get_cpu_affinity(Object *obj, Error **errp)
{ThreadContext *tc = THREAD_CONTEXT(obj);return tc->cpu_affinity;
}static void thread_context_set_cpu_affinity(Object *obj, int value, Error **errp)
{ThreadContext *tc = THREAD_CONTEXT(obj);tc->cpu_affinity = value;
}static void thread_context_register_types(void)
{static const TypeInfo thread_context_info = {.name = TYPE_THREAD_CONTEXT,.parent = TYPE_OBJECT,.instance_size = sizeof(ThreadContext),.instance_init = thread_context_instance_init,.class_init = thread_context_class_init,};type_register_static(&thread_context_info);
}type_init(thread_context_register_types)
使用 ThreadContext
int main(int argc, char *argv[])
{ThreadContext *tc = THREAD_CONTEXT(object_new(TYPE_THREAD_CONTEXT));// 設置 CPU 親和性object_property_set_int(OBJECT(tc), "cpu-affinity", 2, &error_abort);// 查詢 CPU 親和性int cpu_affinity = object_property_get_int(OBJECT(tc), "cpu-affinity", &error_abort);printf("Current CPU affinity: %d\n", cpu_affinity);object_unref(OBJECT(tc));return 0;
}
9.5小結

通過 object_class_property_add,您可以為 QEMU 的對象類添加屬性,并通過回調函數實現對屬性的訪問和修改。在您的代碼中,cpu-affinity 屬性允許用戶通過 QEMU 的命令行工具或 API 查詢和設置線程的 CPU 親和性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90578.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Security架構與實戰全解析

Spring security1.安全架構1. 認證who are you登陸系統&#xff1a;用戶系統2. 授權權限管理&#xff1a;用戶授權3. 攻擊防護xss (cross-site scripting)csrf (cross-site request forgery)cors (cross-origin resource sharing)sql注入4. 擴展&#xff1a;權限管理模型a. RBA…

LeetCode Hot 100 搜索二維矩陣 II

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性&#xff1a;每行的元素從左到右升序排列。每列的元素從上到下升序排列。示例 1&#xff1a;輸入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[…

Windows Edge 播放 H.265 視頻指南

目錄 &#x1f4cc;前言 一 . 什么是 H.265&#xff08;HEVC&#xff09;&#xff1f; 二、為什么 Edge 默認不能播放 H.265&#xff1f; 三、Edge 播放 H.265 解決方案 1 . 查看顯卡是否支持硬解AMD GPU Decoder Device InformationNVIDIA GPU Decoder Device Informat…

線性代數--AI數學基礎復習

原文鏈接&#xff1a;Github-Funny_Mr_Zhi GNN_playground 參考&#xff1a;麻省理工公開課 線性代數 MIT Linear Algebra Chapter1 可以帶著問題去讀&#xff0c;線性代數到底是什么&#xff0c;矩陣又是什么。盡管深入學習數學需要一種抽離出現實和直觀理解的高度抽象思維&…

Cursor配置DeepSeek調用MCP服務實現任務自動化

文章目錄1. 任務需求2. 環境準備2.1 Cursor安裝2.2 Node.js安裝2.3 DeepSeek模型Key申請2.4 高德地圖Key申請3. MCP服務配置3.1 Cursor配置Server方式3.1.1全局設置3.1.2 項目級別設置3.2 MCP服務接入3.2.1 高德地圖MCP服務3.2.2 Mysql MCP服務3.2.3 FileSystem MCP服務3.2.4 驗…

java SpringBoot數據庫查詢 時間范圍查詢

exTime的類型為varchar 存儲的數據格式為yyy-MM-ddTHH:mm:ss,查詢時傳進來的時間格式也需要為yyy-MM-ddTHH:mm:ss格式Query(value "SELECT * FROM test_fbep fbep WHERE delFlag 1 " "AND IF(?1 ! AND ?1 IS NOT NULL, fbep.passId ?1, TRUE) " &q…

Linux 操作系統如何實現軟硬件解耦?從容器與硬件接口封裝談起

在計算機系統中&#xff0c;軟硬件解耦是提升系統靈活性、可移植性和可維護性的核心設計思想。Linux 作為開源操作系統的典范&#xff0c;通過數十年的演進形成了一套成熟的解耦機制。本文將從容器技術和硬件接口封裝兩個維度&#xff0c;深入解析 Linux 如何實現軟硬件解耦&am…

7月10號總結 (1)

今天開始寫web項目&#xff0c;畫了一下登錄界面&#xff0c;借鑒了一下網上的資源。 <!DOCTYPE html> <html lang"zh.CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

Docker 高級管理 -- 容器通信技術與數據持久化

目錄 第一節:容器通信技術 一&#xff1a;Docker 容器的網絡模式 1&#xff1a;Bridge模式 2&#xff1a;Host模式 3&#xff1a;Container模式 4&#xff1a;None模式 5&#xff1a;Overlay 模式 6&#xff1a;Macvlan 模式 7&#xff1a;自定義網絡模式 二&#xff…

鏈路管理和命令管理

第1章 鏈路管理在通信領域&#xff0c;鏈路&#xff08;Link&#xff09; 是兩個設備之間進行數據傳輸的物理或邏輯路徑。例如&#xff1a;網絡鏈路&#xff1a;TCP/IP 連接、UDP 通信、WebSocket串口鏈路&#xff1a;RS232、RS485、CAN 總線無線鏈路&#xff1a;藍牙、Wi-Fi、…

BERT模型基本原理及實現示例

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是Google在2018年提出的預訓練語言模型&#xff0c;其核心思想是通過雙向Transformer結構捕捉上下文信息&#xff0c;為下游NLP任務提供通用的語義表示。 一、模型架構BERT基于Transforme…

NPM組件包 json-cookie-csv 等竊取主機敏感信息

【高危】NPM組件包 json-cookie-csv 等竊取主機敏感信息 漏洞描述 當用戶安裝受影響版本的 json-cookie-csv 等NPM組件包時會竊取用戶的主機名、用戶名、工作目錄、IP地址等信息并發送到攻擊者可控的服務器地址。 MPS編號MPS-xo1f-4kue處置建議強烈建議修復發現時間2025-07-…

【Netty+WebSocket詳解】WebSocket全雙工通信與Netty的高效結合與實戰

一、 Netty網絡框架、WebSocket協議基礎 1.1 Netty網絡框架介紹 1.2 WebSocket簡介 1.3 WebSocket握手流程 二、為什么選擇NettyWebSocket&#xff1f; 三、NettyWebSocket與Spring WebSocket 3.1 架構層級對比 3.2 核心組件差異 3.3 協議支持深度 3.4 性能基準測試 3.5 開發…

5、Vue中使用Cesium實現交互式折線繪制詳解

引言 Cesium是一款強大的開源3D地理信息可視化引擎&#xff0c;廣泛應用于數字地球、地圖可視化等領域。在Vue項目中集成Cesium可以快速構建高性能的地理信息應用。本文將詳細介紹如何在Vue項目中實現交互式折線繪制功能&#xff0c;包括頂點添加、臨時繪制、距離計算等核心功…

mysql實戰之主從復制

原理圖理論&#xff1a;一、配置準備每臺主機都安裝mysql對每臺主機都進行對時操作&#xff0c;減少時間誤差[rooteveryone ~]# timedatectl set-timezone Asia/Shanghai [rooteveryone ~]# systemctl restart chronyd.service 對每臺主機都進行關閉防火墻、上下文等&#xff0…

中望CAD2026亮點速遞(5):【相似查找】高效自動化識別定位

本文為CAD芯智庫整理&#xff0c;未經允許請勿復制、轉載&#xff01;原文轉自&#xff1a;www.xwzsoft.com/h-nd-594.html CAD的相似查找功能主要應用于需要重復操作、標準化控制、一致性檢查或復雜模式識別的場景&#xff0c;通過圖形相似度算法&#xff0c;快速找到匹配的圖…

國產化條碼類庫Spire.Barcode教程:使用 C# 讀取二維碼(QR Code)——從圖片或數據流解析

二維碼已成為現代應用的常見組成部分&#xff0c;廣泛應用于用戶身份驗證、移動支付、商品包裝和活動票務等場景。很多使用 C# 開發的系統需要從圖像或掃描件中提取二維碼信息&#xff0c;因此掌握二維碼識別技術顯得尤為重要。 為滿足這類需求&#xff0c;開發者需要一種既可…

IPSAN 共享存儲詳解:架構、優化與落地實踐指南

一、IPSAN 技術定位與核心價值核心價值對比矩陣&#xff1a;維度IPSANFC-SAN實現方案成本端口成本$500端口成本$2000復用IP網絡設備傳輸距離跨地域&#xff08;VPN/專線&#xff09;≤10公里兩地三中心架構運維效率SNMP/CLI管理Zone/ALPA管理自動化運維工具鏈協議標準IETF RFC …

【衛星語音】基于神經網絡的低碼率語音編解碼(ULBC)方案架構分析:以SoundStream為例

摘要 隨著深度學習技術的快速發展&#xff0c;基于神經網絡的音頻編解碼技術已成為下一代音頻壓縮的重要研究方向。本文以Google提出的SoundStream為核心分析對象&#xff0c;深入探討其在低碼率語音編解碼領域的創新架構設計和關鍵技術突破。SoundStream通過全卷積編解碼器網絡…

技術面試問題總結一

MySQL的幾種鎖機制一、從鎖的粒度角度劃分表級鎖機制&#xff1a;它是對整張表進行鎖定的一種鎖。當一個事務對表執行寫操作時&#xff0c;會獲取寫鎖&#xff0c;在寫鎖持有期間&#xff0c;其他事務無法對該表進行讀寫操作&#xff1b;而當事務執行讀操作時&#xff0c;會獲取…