qemu(2) -- 定制開發板

1. 前言

qemu支持自定義開發板,本文就記錄一下折騰的過程。基于qemu-10.0.0-rc3添加x210vb3s開發板。

2. 添加板卡文件

網上參考了一些文章,有些文章使用的版本和我的不一樣,折騰起來費了點時間,最后發現還是直接參考qemu中已有的開發板文件比較快捷,經過一些嘗試,最后選擇參考hw/arm/xilinx_zynq.c來編寫我的開發板文件,并經過一番嘗試,移除了一些無關緊要的代碼,得到一個能運行的最簡版本。

  1. 新增hw/arm/x210vb3s.c
#include "qemu/osdep.h"
#include "hw/boards.h"
#include "hw/arm/boot.h"
#include "hw/loader.h"
#include "qapi/error.h"struct BoardState {/*< private >*/MachineState parent;/*< public >*/ARMCPU *cpu[1];MemoryRegion iram;MemoryRegion dram;
};/* 此處定義的宏的名字是局部的,字符串“x210bv3s”需要全局唯一 */
#define TYPE_BOARD MACHINE_TYPE_NAME("x210bv3s")
OBJECT_DECLARE_SIMPLE_TYPE(BoardState, BOARD)static struct arm_boot_info boot_info = {/* 該值需要比-kernel指定的可執行文件要大,此處0x18000(96KB)是iRAM的大小,運行裸機程序時,-kernel后面應當指定elf文件 */.ram_size = 0x18000,
};static void board_init(MachineState *ms)
{BoardState *s = BOARD(ms);MachineClass *mc = MACHINE_GET_CLASS(ms);MemoryRegion *system_mem = get_system_memory();/* 創建CPU,如果不創建,qemu啟動后會提示無CPU */Object *cpuobj = object_new(mc->default_cpu_type);qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);s->cpu[0] = ARM_CPU(cpuobj);/* 創建iRAM,如果不添加內存,則qemu啟動后無法訪問任何內存,程序也不能正常加載和執行 *//* iRAM: 0xD0020000-0xD0038000:96KB */memory_region_init_ram(&s->iram, NULL, "iram",0xD0038000-0xD0020000, &error_fatal);memory_region_add_subregion(system_mem, 0xD0020000, &s->iram);/* 啟動-kernel的加載,不執行該函數qemu可以連接gdb,但是不會執行-kernel指定的文件 */arm_load_kernel(s->cpu[0], ms, &boot_info);
}static void board_class_init(ObjectClass *oc, void *data)
{MachineClass *mc = MACHINE_CLASS(oc);static const char * const valid_cpu_types[] = {ARM_CPU_TYPE_NAME("cortex-a8"),NULL};mc->desc = "X210BV3S S5PV210 (Cortex-A8)";mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a8");mc->valid_cpu_types = valid_cpu_types;mc->init = board_init;/* 定義該值為true,程序訪問非法內存時不會產生內存訪問異常 */mc->ignore_memory_transaction_failures = false;
}static const TypeInfo board_info = {.name = TYPE_BOARD,.parent = TYPE_MACHINE,.instance_size = sizeof(BoardState),.class_init = board_class_init,
};static void machine_register(void)
{type_register_static(&board_info);
}type_init(machine_register)

3. 修改編譯文件

  1. hw/arm/Kconfig,按照已有內容格式添加如下內容,可以添加到文件結尾處,default y表示啟動編譯,否者不會參與編譯。
config X210BV3Sbooldefault y
  1. hw/arm/meson.build,按照已有內容添加如下內容,注意是arm_ss不是system_ss,這個問題也折騰了我好久,它們兩個都會被編譯,但是編譯的參數略有不同,此處的編譯條件CONFIG_X210BV3S已經在hw/arm/Kconfig中使能了,所以會被編譯。
arm_ss.add(when: 'CONFIG_X210BV3S', if_true: files('x210bv3s.c'))

4. 重新編譯

# 啟動容器,需要在容器中編譯,我之前的容器停止了,此處直接啟動即可
$ docker start -i qemu
# 此處進入容器環境
$ cd /qemu/build
# 重新配置工程,只編譯qemu-system-arm程序
$ ../configure --target-list=arm-softmmu
# 此時是追加編譯很快就結束了
$ make -j24
# 查看新增的開發板,已經存在了
$ ./qemu-system-arm -M help
x210bv3s             X210BV3S S5PV210 (Cortex-A8)

5. 運行

參考qemu(1) – 安裝中的ctr0.S,此處仍運行該程序。

# 因為沒有將arm-none-eabi工具鏈掛載到容器中,測試多有不便,所以我們可以在wsl中運行qemu-system-arm程序
$ cd qemu-10.0.0-rc3/build
# 啟動qemu,~/workspace/arm/x210bv3s/bare/start/crt0.elf是我之前創建crt0.S測試文件的位置
$ ./qemu-system-arm -M x210bv3s -kernel ~/workspace/arm/x210bv3s/bare/start/crt0.elf -S -s
# 新啟動一個窗口,運行arm-none-eabi-gdb,測試一切正常

上一篇:qemu(1) – 安裝
下一篇:qemu(2) – 定制開發板
目錄:全部文章合集

參考

如何使用 QEMU 模擬一塊開發板
基于qemu從0開始構建嵌入式linux系統

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

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

相關文章

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM)

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數&#xff08;決策樹、邏輯回歸、KNN、SVM&#xff09; 問題模板解題思路1. 導入必要的庫2. 加載數據3. 劃分訓練集和測試集4. 數據預處理5. 定義算法及其參數6. 存儲算法和對應指標7. 訓練模型并計算指標8. 找…

CPU(中央處理器)

一、CPU的定義與核心作用 CPU 是計算機的核心部件&#xff0c;負責 解釋并執行指令、協調各硬件資源 以及 完成數據處理&#xff0c;其性能直接影響計算機的整體效率。 核心功能&#xff1a; 從內存中讀取指令并譯碼。執行算術邏輯運算。控制數據在寄存器、內存和I/O設備間的…

上層 Makefile 控制下層 Makefile 的方法

在復雜的項目中&#xff0c;通常會將項目劃分為多個模塊或子項目&#xff0c;每個模塊都有自己的 Makefile。上層 Makefile 的作用是協調和控制這些下層 Makefile 的構建過程。下面是幾種常見的示例&#xff0c;實現上層 Makefile 對下層 Makefile 的控制。 直接調用&#xff1…

prompts提示詞經典模板

prompts.py 中的提示詞模板詳解 文件中定義了兩個核心提示詞模板&#xff1a;REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。這兩個模板在 DeepResearcher 的推理過程中扮演著關鍵角色。下面我將詳細解析這兩個模板的結構和功能。 REASON_PROMPT 詳解 REASON_PROMPT 是用于指…

使用python獲取電腦硬盤信息

import psutil# 獲取硬盤信息 disk_partitions psutil.disk_partitions() print(disk_partitions) for partition in disk_partitions:print(f"設備: {partition.device}")print(f"掛載點: {partition.mountpoint}")print(f"文件系統類型: {partitio…

HarmonyOS-ArkUI V2裝飾器: @Provider和@Consumer裝飾器:跨組件層級雙向同步

作用 我們在之前學習的那些控件中,各有特點,也各有缺陷,至今沒有痛痛快快的出現過真正能跨組件的雙向綁定的裝飾器。 比如 @Local裝飾器,不能跨組件@Param裝飾器呢,能跨組件傳遞,但是僅僅就是下一層組件接收參數。另外,它是單向傳遞,不可被重新賦值。如果您非要改值則…

索引下推(Index Condition Pushdown, ICP)

概念 索引下推是一種數據庫查詢優化技術&#xff0c;通過在存儲引擎層面應用部分WHERE條件來減少不必要的數據讀取。它特別適用于復合索引的情況&#xff0c;因為它可以在索引掃描階段就排除不符合全部條件的數據行&#xff0c;而不是將所有可能匹配的記錄加載到服務器層再進行…

idea在線離線安裝插件教程

概述 對于小白來說&#xff0c;剛使用idea時&#xff0c;還有很多不懂的地方&#xff0c;這里&#xff0c;簡單介紹下如何安裝插件。讓小白能容易上手全盤idea。 1、File -> Settings 2、找到 Plugins -> Marketplace 3、安裝 3.1、在線安裝 輸入想搜索的內容&#x…

豪越賦能消防安全管控,解鎖一體化內管“安全密碼”

在消防安全保障體系中&#xff0c;內部管理的高效運作是迅速、有效應對火災及各類災害事故的重要基礎。豪越科技憑借在消防領域的深耕細作與持續創新&#xff0c;深入剖析消防體系內部管理的痛點&#xff0c;以自主研發的消防一體化安全管控平臺&#xff0c;為行業發展提供了創…

ES6學習03-字符串擴展(unicode、for...of、字符串模板)和新方法()

一、字符串擴展 1. eg: 2.for...of eg: 3. eg: 二。字符串新增方法 1. 2. 3. 4. 5.

探索Streamlit在測試領域的高效應用:文檔讀取與大模型用例生成的完美前奏

大模型用例生成前置工作之文檔讀取——構建你的自動化測試基礎 在群友的極力推薦下&#xff0c;開始了streamlit的學習之旅。本文將介紹如何使用Streamlit開發一個多功能文檔處理工具&#xff0c;支持讀取、預覽、格式轉換和導出多種測試相關文檔&#xff08;YAML、JSON、DOCX…

flutter 桌面應用之窗口自定義

在開發桌面軟件的時候我們經常需要配置軟件的窗口的大小以及位置 我們有兩個框架選擇:window_manager和bitsdojo_window 對比bitsdojo_window 特性bitsdojo_windowwindow_manager自定義標題欄? 支持? 不支持控制窗口行為&#xff08;大小/位置&#xff09;?&#xff08;基本…

Cyber Weekly #51

賽博新聞 1、英偉達開源新模型&#xff0c;性能直逼DeepSeek-R1 本周&#xff0c;英偉達開源了基于Meta早期Llama-3.1-405B-Instruct模型開發的Llama-3.1-Nemotron-Ultra-253B-v1大語言模型&#xff0c;該模型擁有2530億參數&#xff0c;在多項基準測試中展現出與6710億參數的…

【JS】關于原型/原型鏈

本文會講解什么是原型&#xff0c;什么是原型鏈&#xff0c;以及查找原型的方法&#xff0c;最后會實現一個函數&#xff1a;判斷某對象是否有某屬性。 定義 原型&#xff1a;函數都有prototype屬性&#xff0c;稱作原型/原型對象 原型可以放一些方法和屬性&#xff0c;共享…

deskflow使用教程:一個可以讓兩臺電腦鼠標鍵盤截圖剪貼板共同使用的開源項目

首先去開源網站下載&#xff1a;Release v1.21.2 deskflow/deskflow 兩臺電腦都要下載這個文件 下載好后直接打開找到你想要的exe desflow.exe 然后你打開他&#xff0c;將兩臺電腦的TLS都關掉 下面步驟兩臺電腦都要完成&#xff1a; 電腦點開edit-》preferences 把這個取…

啥是Spring,有什么用,既然收費,如何免費創建SpringBoot項目,依賴下載不下來的解決方法,解決99%問題!

一、啥是Spring&#xff0c;為啥選擇它 我們平常說的Spring指的是Spring全家桶&#xff0c;我們為什么要選擇Spring&#xff0c;看看官方的話&#xff1a; 意思就是&#xff1a;用這個東西&#xff0c;又快又好又安全&#xff0c;反正就是好處全占了&#xff0c;所以我們選擇它…

正向代理 vs 反向代理:核心區別與應用場景詳解

目錄 代理服務器是什么&#xff1f; 正向代理&#xff08;Forward Proxy&#xff09;詳解 工作原理 典型應用場景 優缺點分析 反向代理&#xff08;Reverse Proxy&#xff09;詳解 工作原理 典型應用場景 優缺點分析 正向代理與反向代理的核心區別 對比表格 架構差異…

Matlab學習筆記五十:循環語句和條件語句的用法

1.說明 循環語句&#xff1a;for…end&#xff0c;while…end 條件語句&#xff1a;if…end&#xff0c;switch…case…end 其中if語句語法還可以是&#xff1a;for…else…end&#xff0c;for…elseif…else…end 2.簡單for程序實例 for x1:5 %循環遍歷1~5 yx5 end [1…

容器初始化Spring Boot項目原理,即web項目(war)包涉及相關類對比詳解

以下是關于 SpringBootServletInitializer、ServletContainerInitializer、SpringServletContainerInitializer、WebApplicationInitializer 和 ServletInitializer 的對比詳解及總結表格&#xff1a; 1. 核心對比詳解 (1) SpringBootServletInitializer 作用&#xff1a; S…

Linux 系統中打包與壓縮

以下是 Linux 系統中 打包與壓縮 的核心操作指南&#xff0c;涵蓋常用命令、格式對比及典型場景應用&#xff1a; 一、核心概念 打包&#xff08;Archiving&#xff09; 將多個文件或目錄合并為一個文件&#xff08;如 .tar&#xff09;&#xff0c;不改變文件體積。常用工具&a…