Magenta- Qemu + bootloader

这章节比较鸡肋,和Magenta关系不大,但涉及到传给Magenta参数的方式,为了完整性,就简单的写些吧。


Magenta的code下载、配置、编译等等就不说了,就从其从Qemu中运行开始说起。如下是Qemu启动Magenta的命令:


qemu-system-x86_64  -m 2048 -serialstdio -vga std -net none -smp 4 -machine q35

-kernel /home/kevin/workshop/room/source/fuchsia/magenta/build-magenta-pc-x86-64/magenta.bin

-enable-kvm -cpu host,migratable=no

-initrd/home/kevin/workshop/room/source/fuchsia/magenta/build-magenta-pc-x86-64/bootdata.bin

-append

'TERM=xterm-256color

kernel.entropy=88bfa2b8b8e13a693bfb61d005be65ae62943defa58af31bb11d0e9c9b59ef71'

Kernel.halt_on_panic=true


由此可见:

1/ 我所测试的Magenta是基于X86-64架构;

2/ machine类型是q35,会依此参数使用pc-q35;

3/ Magenta的kernel bin文件是magenta.bin;

4/ initrd是bootdata.bin;

5/ cmdline包括"-append"所带的3个参数行;


Qemu loader


Qemu支持2种boot方式:multiboot和hdrs。 multiboot方式优先。

2种boot都分为2步:
1/ 搜集info,包括kernel,cmdline,initrd。并保存在BIOS的fw文件中;
2/ 根据info,加载并跳转;

multiboot规范可参见:

如果在kernel bin的header搜寻到magic num:0x1BADB002,则表示支持multiboot,则按mutliboot规范搜集info,包括: kernel的加载地址,entry,initrd地址,cmdline,memory info。
multiboot方式的加载是由“multiboot.bin"实现的,其会将info的地址传递给register ebx,eax赋值为0x2badb002,最后跳转至kernel entry。
后期magenta会将info解析为struct multiboot_info。

如果kernel bin不支持multiboot,则尝试hdrs方式,协议参见如下:

如果在kernel bin的header的偏移0x202处是字符串”hdrs“,表示支持hdrs方式,则按此方式解析header,并搜集info。
hdrs方式的加载由"linuxboot.bin"实现,其最后会跳转至偏移0x200处,此处是2个字节的jump指令;从而可以跳至用户期望的startup code。

Qemu osloader

如果需要支持2级loader,则Qemu使用osloader。其期望kernel bin的header有如下的layout:

typedef struct {

    bootdata_t hdr_file;

    bootdata_t hdr_kernel;

    bootdata_kernel_tdata_kernel;

}magenta_kernel_t

解析此结构,得到kernel的地址和entry。然后生成tag方式的param列表,并以register esi方式传递给kernel。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值