260 likes | 617 Views
QEMU 建立系統 之方法. 許維哲 Dept. of Electrical Engineering National Cheng Kung University Tainan, Taiwan, R.O.C. 系統 建立 (1/2). 電腦硬體由下列五大單元所組成 : 控制單元 算術邏輯單元 記憶單元 輸入單元 輸出單元. CPU. 控制訊號. 資料路徑. 控制單元. 輸出單元. 輸入單元. 算術邏輯單元. 記憶單元. 系統 建立 (2/2). 在進行其功能模擬時,我們將其簡化為下 : CPU: 結合控制單元與算術邏輯單元之功能 記憶單元
E N D
QEMU建立系統之方法 許維哲 Dept. of Electrical Engineering National Cheng Kung University Tainan, Taiwan, R.O.C
系統建立(1/2) • 電腦硬體由下列五大單元所組成: • 控制單元 • 算術邏輯單元 • 記憶單元 • 輸入單元 • 輸出單元 CPU 控制訊號 資料路徑 控制單元 輸出單元 輸入單元 算術邏輯單元 記憶單元
系統建立(2/2) • 在進行其功能模擬時,我們將其簡化為下: • CPU:結合控制單元與算術邏輯單元之功能 • 記憶單元 • 周邊裝置:輸出/輸入單元 CPU 記憶單元 資料匯流排 控制訊號匯流排 周邊裝置 周邊裝置 周邊裝置
系統建立流程 • 首先,要建立系統中的所有裝置元件,並將所有的裝置元件做訊號連接,流程如下: 建立CPU 建立記憶單元 記憶單元訊號連接 建立周邊裝置 裝置連接
建立CPU(1/2) • QEMU會建立一個CPU專屬的資料結構,稱為CPUState,用來存放CPU中的下列內容: • 暫存器 • 控制訊號 • 處理器狀態 • 輸出入訊號 • 處理器產品資訊 • QEMU模擬CPU時會用到的相關訊號 • 以下為QEMU所支援模擬的CPU指令集列表:
建立記憶單元(1/4) • 在QEMU中,使用qemu_ram_alloc()函式來建立模擬目標系統上的記憶單元。 • qemu_ram_alloc()函式原型 • ram_addr_tqemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_tsize) • dev : 此次建立的記憶單元,所屬於哪個裝置;若是建立系統共用的記憶單元,則此項輸入參數為NULL值。 • name : 此記憶單元的名稱,方便辨識。 • size : 此記憶單元的大小,單位為Byte。 • qemu_ram_alloc()函式行為 • 向主機平台(HostMachine),宣告一個指定size的記憶空間,用來模擬目標平台(Target Machine)上的記憶單元。 • 建立一個RAMBlock資料結構,用來記錄與管理此記憶單元,RAMBlock資料結構即為虛擬記憶單元(QEMU所模擬出來)與真實記憶單元(執行QEMU的實體主機)的對映。 • 將此RAMBlock資料結構加入ram_list鏈結表中統一管理。
建立記憶單元(2/4) • RAMBlock資料結構說明 • 實例說明 • ARM Versatile-PB platform • 系統預設記憶體大小為128MB typedefstructRAMBlock{uint8_t *host;ram_addr_t offset;ram_addr_t length;uint32_t flags;char idstr[256];structRAMBlock *next;} RAMBlock;
建立記憶單元(3/4) • ARM Versatile-Express(Vexpress) platform • 此系統預設了三個記憶體單元: • 主系統記憶體128MB • 影像顯示記憶體8MB • 周邊裝置私有記憶體32MB Versatilepb platform的記憶體配置 主機平台 QEMU的ram_list鏈結表 Memory 0xFFFFFFFF 0x80000000 ram_list 0x70000000 0x41000000 structRAMBlock 0x40000000 0x20000000 0x0 128MB 0x14000000 0x8000000 0x101F5000 NULL 0x10000000 0x08000000 0x00000000
建立記憶單元(4/4) Vexpressplatform的記憶體配置 主機平台 QEMU的ram_list鏈結表 0xFFFFFFFF Memory 0xE0000000 ram_list 0xA0000000 0x60000000 structRAMBlock 0x5C000000 0x50000000 0x0 128MB 0x8000000 0x4F000000 0x4E000000 0x4C800000 8MB 0x4C000000 0x4A000000 0x8000000 0x48000000 0x800000 0x44000000 0x40000000 0x20000000 0x10020000 32MB 0x8800000 0x2000000 0x10000000 0x04000000 NULL 0x00000000
建立周邊裝置(1/2) • QEMU會為系統上的每個周邊裝置,建立專屬的資料結構,其內容通常為下: • 裝置元件所連接Data Bus的相關訊號 • AMBABus、PCI Bus、USB Bus…等 • 裝置元件所連接Control Bus的相關訊號 • 中斷控制訊號…等 • 裝置元件的輸出入訊號 • 裝置元件的狀態 • Status、flags…等 • 裝置元件中需要被暫存的訊號與資料 • buffer、stack…等 • 實例說明 • 以ARMVersatilepb platform上的PL050裝置(Arm PrimeCell PL050 Keyboard / Mouse Interface)為例:
建立周邊裝置(2/2) typedefstruct{SysBusDevicebusdev;void *dev;uint32_t cr;uint32_t clk;uint32_t last;int pending;qemu_irqirq;intis_mouse;} pl050_state; System Data Bus相關訊號 裝置I/O訊號 中斷控制訊號 裝置狀態
裝置連接(1/10) • 由於ARM系統使用Memory Mapping I/O,所有系統上的裝置皆會有一組相對應的記憶體位址。 • 當CPU欲存取某一周邊裝置或記憶單元時,便使用其相對應的記憶體位址做存取資料的行為。 • QEMU在建立記憶體單元與周邊裝置時,亦會建立一個記憶體位址對映表(PhysPageDesctable ),用來標示記憶單元或周邊裝置所占有的記憶體位址。 • 將記憶體位址註冊到記憶體位址對映表中的方法如下: • 在建立記憶單元與周邊裝置時,使用cpu_register_physical_memory()函式,將該記憶單元或周邊裝置所佔有的記憶體位址註冊到記憶體位址對映表中。 • cpu_register_physical_memory()函式說明: • 原始程式碼為下: void cpu_register_physical_memory(target_phys_addr_tstart_addr,ram_addr_t size, ram_addr_tphys_offset){cpu_register_physical_memory_offset(start_addr, size, phys_offset, 0);}
裝置連接(2/10) • 實際呼叫函式為cpu_register_physical_memory_offset(),主要動作為建立PhysPageDesctable,並將指定的記憶體位址區段加入到PhysPageDesctable中,以下為PhysPageDesctable之介紹: • PhysPageDesctable為記憶體位址的對映表,與系統裝置同時建立,以提供CPU轉換位址時使用。 • PhysPageDesctable為加快搜尋位址的速度,使用兩層的結構(L1 table與L2 table),位址的區分如下: • 以ARM 模擬目標系統為例,記憶體位址的區分為下: • 記憶體位址[31:20]為L1_index • 記憶體位址[19:10]為L2_index • 記憶體位址[9:0]為目標分頁的偏移值 高位元 低位元 Target Physical Address 31 0 19 9 Target Physical Address
裝置連接(3/10) • 資料結構PhysPageDesc說明 • 結構內容 • 完整的PhysPageDesctable架構如下圖 • 由全域變數l1_phys_map指向PhysPageDesctable的開頭 • L1 table中有L1_index個PhysPageDesc*指標,每一個PhysPageDesc*指標又指向由L2_index個PhysPageDesc結構所組成的L2 table typedefstructPhysPageDesc {ram_addr_tphys_offset;ram_addr_tregion_offset;} PhysPageDesc;
裝置連接(4/10) 高位元 低位元 Target Physical Address L2 tables L1 table PhysPageDesc * PhysPageDesc PhysPageDesc ** l1_phys_map [0] [0] (Global variable in exec.c) [L2_index] 最多會有L1_index*L2_index個PhysPageDesc結構 [L1_index] [0] [L2_index]
裝置連接(5/10) • 在QEMU所模擬的系統當中,CPU與周邊裝置的資料存取,是透過呼叫周邊裝置的read/write function來完成資料的讀/寫,如下圖: • QEMU在建立周邊裝置的同時,會將每個周邊裝置的CPUWriteMemoryFunc()、CPUReadMemoryFunc()與Device_state存放在io_mem table中,統一管理。 周邊裝置 Device_State CPUWriteMemoryFunc() CPU Device_behavior_function() CPUReadMemoryFunc()
裝置連接(6/10) • io_mem table說明 /* Global Variables in Exec.c*//* io memory support *//* In ARM system, IO_MEM_NB_ENTRIES = 128 */CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][3];CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][3];void *io_mem_opaque[IO_MEM_NB_ENTRIES];static char io_mem_used[IO_MEM_NB_ENTRIES];
裝置連接(7/10) • 綜合上述流程,QEMU所建立的系統資料存取架構如下: CPU 主機平台記憶體 Target Physical Address ram_list RAM PhysPageDesc table I/O memory Device A io_mem tables io_mem_read[]io_mem_write[]io_mem_opaque[] Device B Device N
裝置連接(8/10) • 在一個系統中,CPU除了使用資料線與所有周邊裝置做連接,另外也會有控制線的連接,一般常見的控制線即為中斷訊號。 • ARMVersatilepb platform的中斷訊號連接圖 • 使用了兩層的中斷訊號控制器,高優先權的裝置將中斷訊號接在PIC;低優先權的裝置將中斷訊號接在SIC。
裝置連接(9/10) • QEMU所模擬的ARM Versatilepb platform中斷訊號連接圖 vpb_sic_state sic[30] PCI3 sic[29] PCI2 sic[28] PCI1 sic[27] PCI0 pl190_state sic[25] Ethernet pic[31] sic[23] SIC(Secondary Interrupt Controller) MMCI1A pic[17] sic[22] DMAC MMCI0A CPUARMState pic[16] sic[6] CLCD UART3 pic[14] cpu_pic[0] sic[4] UART2 IRQ KMI1 PIC(Primary Interrupt Controller) CPU pic[13] sic[3] UART1 cpu_pic[1] KMI0 FIQ pic[12] sic[2] UART0 MMCI1B sic[1] pic[10] MMCI0B Real Time Clock pic[5] Timer 2 and 3 pic[4] Timer 0 and 1
裝置連接(10/10) • QEMU所模擬的ARM Versatile-Express platform中斷訊號連接圖 gic_state CPUARMState pic[48] Dual Timer module parnet_irq[0] CPU[0] pic[44] IRQ CLCD pic[15] Ethernet pic[13] CPUARMState KMI1 pic[12] KMI0 parnet_irq[1] CPU[1] IRQ pic[11] Audio pic[10] MMCI1 GIC(Generic Interrupt Controller ) CPUARMState pic[9] MMCI0 pic[8] parnet_irq[2] CPU[2] UART3 IRQ pic[7] UART2 pic[6] UART1 CPUARMState pic[5] UART0 pic[4] RTC parnet_irq[3] CPU[3] IRQ pic[3] Timer 2/3 pic[2] Timer 0/1
Versatilepbplatform in QEMU PIC : Primary Interrupt Controller SIC : Secondary Interrupt Controller cpu_pic[0~1] PhysPageDesc table Host Mem pic[31] pic[0~30] sic[0~31] io_mem table System Bus PIC Bus SIC Bus pic[0] pic[1] sic[1] sic[0] PIC CPU Device[N] Device[3] Device[2] Device[1] Device[0] SIC ram_list APB Devices AHB Devices
Versatile-Express platform in QEMU GIC : Generic Interrupt Controller GIC cpu_irq[2] cpu_irq[0] cpu_irq[3] cpu_irq[1] CPU[3] CPU[0] CPU[1] CPU[2] pic[0~63] Host Mem ram_list PhysPageDesc table io_memtable System Bus IRQ Bus pic[0] pic[1] pic[2] pic[n] Device[N] Device[2] Device[1] Device[0]
NEXT • Loading kernel • 將OSkernel image、Root file system、bootloader code載入到模擬目標系統上 • QEMU動態模擬 • 中斷訊號接收與處理 • 動態二進制轉換 • Translation Block • 中間碼轉換