Transcript QEMU建立系統之
QEMU建立系統之方法
許維哲
Dept. of Electrical Engineering
National Cheng Kung University
Tainan, Taiwan, R.O.C
NCKU EE CAD
系統建立(1/2)
電腦硬體由下列五大單元所組成:
控制單元
算術邏輯單元
記憶單元
輸入單元
輸出單元
CPU
控制單元
控制訊號
資料路徑
算術邏輯單元
輸入單元
WeiZhe, Hsu, NCKU
記憶單元
輸出單元
SoC Lab 2
NCKU EE CAD
系統建立(2/2)
在進行其功能模擬時,我們將其簡化為下:
CPU:結合控制單元與算術邏輯單元之功能
記憶單元
周邊裝置:輸出/輸入單元
CPU
記憶單元
資料匯流排
控制訊號匯流排
周邊裝置
WeiZhe, Hsu, NCKU
周邊裝置
周邊裝置
SoC Lab 3
NCKU EE CAD
系統建立流程
首先,要建立系統中的所有裝置元件,並將所有的裝置元件做
訊號連接,流程如下:
建立CPU
建立記憶單元
記憶單元訊號連接
建立周邊裝置
裝置連接
WeiZhe, Hsu, NCKU
SoC Lab 4
NCKU EE CAD
建立CPU(1/2)
QEMU會建立一個CPU專屬的資料結構,稱為CPUState,用來存
放CPU中的下列內容:
暫存器
控制訊號
處理器狀態
輸出入訊號
處理器產品資訊
QEMU模擬CPU時會用到的相關訊號
以下為QEMU所支援模擬的CPU指令集列表:
指令集
UniCore32
LatticeMico32
CRIS
SPARC
Alpha
SH4
WeiZhe, Hsu, NCKU
建立的CPUState
struct CPUState_UniCore32
struct CPULM32State
struct CPUCRISState
struct CPUSPARCState
struct CPUAlphaState
struct CPUSH4State
SoC Lab 5
NCKU EE CAD
建立CPU(2/2)
指令集
PowerPC
i386
XTENSA
S/390
ARM
m68k
MicroBlaze
MIPS
WeiZhe, Hsu, NCKU
建立的CPUState
struct CPUPPCState
struct CPUX86State
struct CPUXtensaState
struct CPUS390XState
struct CPUARMState
struct CPUM68KState
struct CPUMBState
struct CPUMIPSState
SoC Lab 6
NCKU EE CAD
建立記憶單元(1/4)
在QEMU中,使用qemu_ram_alloc()函式來建立模擬目標系統上的
記憶單元。
qemu_ram_alloc()函式原型
ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size)
dev : 此次建立的記憶單元,所屬於哪個裝置;若是建立系統共用的記憶
單元,則此項輸入參數為NULL值。
name : 此記憶單元的名稱,方便辨識。
size : 此記憶單元的大小,單位為Byte。
qemu_ram_alloc()函式行為
向主機平台(Host Machine),宣告一個指定size的記憶空間,用來模擬目標
平台(Target Machine)上的記憶單元。
建立一個RAMBlock資料結構,用來記錄與管理此記憶單元,RAMBlock資
料結構即為虛擬記憶單元(QEMU所模擬出來)與真實記憶單元(執行QEMU
的實體主機)的對映。
將此RAMBlock資料結構加入ram_list鏈結表中統一管理。
WeiZhe, Hsu, NCKU
SoC Lab 7
NCKU EE CAD
建立記憶單元(2/4)
RAMBlock資料結構說明
typedef struct RAMBlock {
uint8_t *host;
ram_addr_t offset;
ram_addr_t length;
uint32_t flags;
char idstr[256];
struct RAMBlock *next;
} RAMBlock;
結構成員
說明
*host
指向新宣告實體記憶體空間(主機平台)的指標(host virtual
address)
上一筆RAMBlock宣告記憶體時的結束位址(目標平台),
亦即本筆新宣告記憶體空間的起始位址(目標平台)(target
physical address)
此RAMBlock所指向的記憶體空間的大小(單位為Bytes)
offset
length
flag
此記憶單元的狀態
idstr
此記憶單元的名稱
*next
指向下一個RAMBlock資料結構
實例說明
ARM Versatile-PB platform
系統預設記憶體大小為128MB
WeiZhe, Hsu, NCKU
SoC Lab 8
NCKU EE CAD
建立記憶單元(3/4)
Versatilepb platform的記憶體配置
QEMU的ram_list鏈結表
0xFFFFFFFF
Logic Tile expansion
0x80000000
Dynamic memory expansion socket
0x70000000
PCI Bus
MBX
Static Memory
AHB M2 EXP
Reserved
Registers
Dynamic expansion socket
SDRAM
0x41000000
0x40000000
0x20000000
0x14000000
0x101F5000
0x10000000
0x08000000
0x00000000
主機平台
Memory
ram_list
struct RAMBlock
*host
offset
length
*next
0x0
0x8000000
128MB
NULL
ARM Versatile-Express(Vexpress) platform
此系統預設了三個記憶體單元:
主系統記憶體128MB
影像顯示記憶體8MB
周邊裝置私有記憶體32MB
WeiZhe, Hsu, NCKU
SoC Lab 9
NCKU EE CAD
建立記憶單元(4/4)
Vexpress platform的記憶體配置
0xFFFFFFFF
External AXI between daughterboards
0xE0000000
Daughterboard private
0xA0000000
Local DDR2 RAM
0x60000000
Reserved
0x5C000000
Motherboard
Reserved
0x50000000
memory and
USB
0x4F000000
peripherals
Ethernet
0x4E000000
Reserved
0x4C800000
Video SRAM
0x4C000000
Reserved
0x4A000000
SRAM
0x48000000
NOR Flash 1
0x44000000
NOR Flash 0
0x40000000
Reserved
0x20000000
Daughterboard private peripherals
0x10020000
Motherboard peripherals
0x10000000
Reserved
0x04000000
Remappable memory section
0x00000000
WeiZhe, Hsu, NCKU
QEMU的ram_list鏈結表
主機平台
Memory
ram_list
struct RAMBlock
*host
offset
length
*next
0x0
0x8000000
128MB
8MB
*host
offset
length
*next
0x8000000
0x800000
*host
offset
length
*next
0x8800000
0x2000000
32MB
NULL
SoC Lab 10
NCKU EE CAD
建立周邊裝置(1/2)
QEMU會為系統上的每個周邊裝置,建立專屬的資料結構,其
內容通常為下:
裝置元件所連接Data Bus的相關訊號
裝置元件所連接Control Bus的相關訊號
中斷控制訊號…等
裝置元件的輸出入訊號
裝置元件的狀態
Status、flags…等
裝置元件中需要被暫存的訊號與資料
AMBA Bus、PCI Bus、USB Bus…等
buffer、stack…等
實例說明
以ARM Versatilepb platform上的PL050裝置(Arm PrimeCell PL050 Keyboard /
Mouse Interface)為例:
WeiZhe, Hsu, NCKU
SoC Lab 11
NCKU EE CAD
建立周邊裝置(2/2)
typedef struct {
SysBusDevice busdev;
System Data
void *dev;
uint32_t cr;
uint32_t clk;
裝置I/O訊號
uint32_t last;
int pending;
qemu_irq irq;
中斷控制訊號
int is_mouse;
裝置狀態
} pl050_state;
WeiZhe, Hsu, NCKU
Bus相關訊號
SoC Lab 12
NCKU EE CAD
裝置連接(1/10)
由於ARM系統使用Memory Mapping I/O,所有系統上的裝置皆會
有一組相對應的記憶體位址。
當CPU欲存取某一周邊裝置或記憶單元時,便使用其相對應的
記憶體位址做存取資料的行為。
QEMU在建立記憶體單元與周邊裝置時,亦會建立一個記憶體
位址對映表(PhysPageDesc table ),用來標示記憶單元或周邊裝
置所占有的記憶體位址。
將記憶體位址註冊到記憶體位址對映表中的方法如下:
在建立記憶單元與周邊裝置時,使用cpu_register_physical_memory()函式,
將該記憶單元或周邊裝置所佔有的記憶體位址註冊到記憶體位址對映表
中。
cpu_register_physical_memory()函式說明:
原始程式碼為下:
void cpu_register_physical_memory(target_phys_addr_t start_addr, ram_addr_t size, ram_addr_t
phys_offset) {
cpu_register_physical_memory_offset(start_addr, size, phys_offset, 0);
}
WeiZhe, Hsu, NCKU
SoC Lab 13
NCKU EE CAD
裝置連接(2/10)
實際呼叫函式為cpu_register_physical_memory_offset(),主要動作為建立
PhysPageDesc table,並將指定的記憶體位址區段加入到PhysPageDesc table中
,以下為PhysPageDesc table之介紹:
PhysPageDesc table為記憶體位址的對映表,與系統裝置同時建立,以提
供CPU轉換位址時使用。
PhysPageDesc table為加快搜尋位址的速度,使用兩層的結構(L1 table與L2
table),位址的區分如下:
高位元
低位元
Target Physical Address L1_index L2_index Target_page_offset
以ARM 模擬目標系統為例,記憶體位址的區分為下:
31
Target Physical Address
WeiZhe, Hsu, NCKU
19
9
0
L1_index L2_index Target_page_offset
記憶體位址[31:20]為L1_index
記憶體位址[19:10]為L2_index
記憶體位址[9:0]為目標分頁的偏移值
SoC Lab 14
NCKU EE CAD
裝置連接(3/10)
資料結構PhysPageDesc說明
結構內容
typedef struct PhysPageDesc {
ram_addr_t phys_offset;
ram_addr_t region_offset;
} PhysPageDesc;
完整的PhysPageDesc table架構如下圖
WeiZhe, Hsu, NCKU
由全域變數l1_phys_map指向PhysPageDesc table的開頭
L1 table中有L1_index個PhysPageDesc *指標,每一個PhysPageDesc *指標 又
指向由L2_index個PhysPageDesc結構所組成的L2 table
SoC Lab 15
NCKU EE CAD
裝置連接(4/10)
高位元
低位元
Target Physical Address L1_index L2_index Target_page_offset
L1 table
PhysPageDesc **
l1_phys_map
PhysPageDesc *
[0]
L2 tables
PhysPageDesc
[0]
(Global variable in exec.c)
[L2_index]
[L1_index]
[0]
最多會有
L1_index*L2_index個
PhysPageDesc結構
[L2_index]
WeiZhe, Hsu, NCKU
SoC Lab 16
NCKU EE CAD
裝置連接(5/10)
在QEMU所模擬的系統當中,CPU與周邊裝置的資料存取,是透
過呼叫周邊裝置的read/write function來完成資料的讀/寫,如下圖:
周邊裝置
Device_State
CPU
CPUWriteMemoryFunc()
Device_behavior_function()
CPUReadMemoryFunc()
QEMU在建立周邊裝置的同時,會將每個周邊裝置的
CPUWriteMemoryFunc()、 CPUReadMemoryFunc()與Device_state存放
在io_mem table中,統一管理。
WeiZhe, Hsu, NCKU
SoC Lab 17
NCKU EE CAD
裝置連接(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];
變數名稱
說明
io_mem_write
將資料寫到IO裝置的函式指標陣列,第一維參數為io_index,即每個
IO裝置皆會配給一個io_index,第二維參數為函式寫入方式(0表示以
byte為單位做存取,1表示以word為單位做存取,2表示以dword為單
位做存取)
io_mem_read
將資料從IO裝置讀取出的函式指標陣列
io_mem_opaque 每個裝置皆有其所屬的state,io_mem_opaque則是指向所有裝置state
的指標陣列,若同一個io_index有r/w函式但無專屬state,則該
io_mem_opaque[io_index] = 0
io_mem_used
WeiZhe, Hsu, NCKU
用來記錄第n個io_index是否已經被註冊使用,0表示無人註冊使用,1
表示已被註冊使用
SoC Lab 18
NCKU EE CAD
裝置連接(7/10)
綜合上述流程,QEMU所建立的系統資料存取架構如下:
CPU
Target Physical Address
RAM
ram_list
主機平台記憶體
PhysPageDesc table
I/O memory
io_mem tables
io_mem_read[]
io_mem_write[]
io_mem_opaque[]
Device A
Device B
Device N
WeiZhe, Hsu, NCKU
SoC Lab 19
NCKU EE CAD
裝置連接(8/10)
在一個系統中,CPU除了使用資料線與所有周邊裝置做連接,
另外也會有控制線的連接,一般常見的控制線即為中斷訊號。
ARM Versatilepb platform的中斷訊號連接圖
使用了兩層的中斷訊號控制器,高優先權的裝置將中斷訊號接在PIC;低優先
權的裝置將中斷訊號接在SIC。
WeiZhe, Hsu, NCKU
SoC Lab 20
NCKU EE CAD
裝置連接(9/10)
QEMU所模擬的ARM Versatilepb platform中斷訊號連接圖
vpb_sic_state
PCI1
PCI0
Ethernet
MMCI1A
MMCI0A
UART3
KMI1
sic[29]
sic[28]
sic[27]
sic[25]
sic[23]
sic[22]
sic[6
]
sic[4]
sic[3]
KMI0
sic[2]
MMCI1B
sic[1
MMCI0B
]
pl190_state
pic[31]
pic[17]
DMAC
pic[16]
CLCD
UART2
pic[13
UART1
]
pic[12]
UART0
Real Time Clock
Timer 2 and 3
Timer 0 and 1
WeiZhe, Hsu, NCKU
pic[14]
pic[10]
pic[5]
pic[4
]
PIC(Primary Interrupt Controller)
PCI2
sic[30]
SIC(Secondary Interrupt Controller)
PCI3
CPUARMState
cpu_pic[0]
cpu_pic[1]
IRQ
FIQ
CPU
SoC Lab 21
NCKU EE CAD
裝置連接(10/10)
QEMU所模擬的ARM Versatile-Express platform中斷訊號連接圖
gic_state
CLCD
Ethernet
KMI1
KMI0
Audio
MMCI1
MMCI0
UART3
UART2
UART1
UART0
RTC
Timer 2/3
Timer 0/1
WeiZhe, Hsu, NCKU
parnet_irq[0]
pic[44]
IRQ
CPU[0]
pic[15]
pic[13]
pic[12]
pic[11]
pic[10]
pic[9]
pic[8]
pic[7]
pic[6
]
pic[5]
pic[4]
pic[3]
GIC(Generic Interrupt Controller )
Dual Timer module
CPUARMState
pic[48]
CPUARMState
parnet_irq[1]
IRQ
CPU[1]
CPUARMState
parnet_irq[2]
IRQ
CPU[2]
CPUARMState
parnet_irq[3]
IRQ
CPU[3]
pic[2]
SoC Lab 22
NCKU EE CAD
Versatilepb platform in QEMU
PIC : Primary Interrupt Controller
SIC : Secondary Interrupt Controller
cpu_pic[0~1]
CPU
Host
Mem
PIC
PhysPageDesc
table
ram_list
pic[31]
pic[0~30]
SIC
sic[0~31]
io_mem table
System Bus
PIC Bus
pic[0]
Device[0]
pic[1]
Device[1]
AHB Devices
WeiZhe, Hsu, NCKU
Device[2]
SIC Bus
sic[1]
sic[0]
Device[3]
Device[N]
APB Devices
SoC Lab 23
NCKU EE CAD
Versatile-Express platform in QEMU
GIC : Generic Interrupt Controller
cpu_irq[0]
CPU[0]
Host
Mem
ram_list
cpu_irq[1]
CPU[1]
cpu_irq[2]
CPU[2]
GIC
cpu_irq[3]
CPU[3]
pic[0~63]
PhysPageDesc table
io_mem table
System Bus
IRQ Bus
pic[0]
Device[0]
WeiZhe, Hsu, NCKU
pic[1]
Device[1
]
pic[2]
Device[2]
pic[n]
Device[N]
SoC Lab 24
NCKU EE CAD
NEXT
Loading kernel
將OS kernel image、Root file system、bootloader code載入到模擬目標系統上
QEMU動態模擬
中斷訊號接收與處理
動態二進制轉換
Translation Block
中間碼轉換
WeiZhe, Hsu, NCKU
SoC Lab 25