Xhyper剖析[2]--Xhyper启动

3.1 设备内存分布
项目使用qemu的aarch64的virt机器来运行
CPU="cortex-a72" |
其中virt的内存分布如下,定义在qemu源码的hw/arm/virt.c中
static const MemMapEntry base_memmap[] = { |
-bios指定的uboot的镜像会被加载到FLASH处执行DRAM的起始地址为GIB,GIB的值为:#define GiB (INT64_C(1) << 30)即0x4000 0000-device loader指令可以把X-Hyper_Uimage镜像加载到0x40200000处
3.2 uboot配置
uboot的下载编译执行脚本如下:
|
sed -i 's/CONFIG_PREBOOT="usb start"/CONFIG_PREBOOT="bootm 0x40200000- 这个修改目的是让
uboot先使用bootm从内存地址0x40200000加载镜像
3.3 Xhyper镜像生成
|
- 使用
mkimage来生成*X-Hyper_Uimage*,这样得到的镜像会包含一个UImage Header

- 此头部的信息可以使用如下的命令看见

Ulmage Header 中关键的两个值:
- Load Address :即 U-boot 加载管理器镜像的内存地址,在 U-boot 中使用 bootm 加载Ulmage 后,U-boot 会解析 Ulmage 的 Header,并根据 Load Address 将 Uimage 的虚拟机管理器镜像文件重新加载到 0x40200000 处;
- Entry Point: U-boot 加载完虚拟机管理器镜像文件到指定内存地址后,再根据Entry Point 跳转到0x40200000 处,也就是虚拟机管理器镜像文件中的的start 处开始执行程序;
流程如下:

3.4 Guest管理
3.4.1 Guest os 镜像生成
Guest os 的镜像文件编译后链接首先生成Guest_VM.elf

然后通过objcopy指令转换成去除elf头部的二进制可执行文件Guest_VM,最后通过ld指令将Guest_VM转换成可重定位目标文件Guest_VM.o

Xhyper通过链接Guest_VM.o将Guest os的镜像加入到xhper的镜像文件中:

- 其中
Guest_VM.o的链接地址定义再layout.h中:#define HIMAGE_VADDR 0x40200000

- 通过如下指令可以看见被链接的
Guest_VM.o镜像的信息

- 输出的三行是
ld链接器在处理二进制文件时自动生成的符号,对应之前通过ld -r -b binary转换的二进制文件
3.4.2 Xhyper读入Guest os
首先定义一个guest结构体用来描述一个guest os的镜像:
//vm.h |
定义guest_vm_image来读取:
//guest.c |
接着定义vm配置结构体,用vm_config_t来代替一个Guest os
typedef struct vm_config { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TimerのBlog!







