如何为q35机器制作简单的bootloader

How to make simple bootloader for q35 machine

我正在关注 babystep bootloader guide writing the code on 当我 运行 带有 qemu-system-x86_64 -machine type=pc,accel=kvm -drive 'format=raw,file=boot.bin' 的图像按预期工作时,但我想将机器类型更改为 q35.

这是我的代码:

.global _start
.code16
.text
_start:
        cli
        jmp .
.org 510
.word 0xaa55

编译:

gcc \
  -Wl,--oformat=binary \
  -Wl,-Ttext=0x7c00 \
  -Wl,--build-id=none \
  -nostartfiles \
  -nostdlib \
  -m32 \
  -o boot.bin \
  boot.s

它应该挂起,type=pc 我有以下结果: 如果您尝试在此处键入 Ctrl-Alt-Delete,则没有任何反应,这是预期的行为。

并且 type=q35 结果如下:

如何使用 type=q35 获得与 type=pc 相同的结果?

P.S.: 部分解:

qemu-img create -f qcow2 -o lazy_refcounts=on disk.qcow2 16G
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 disk.qcow2
sudo dd if=boot.bin of=/dev/nbd0 status=progress
sudo qemu-nbd --disconnect /dev/nbd0
# ... -drive 'format=qcow2,l2-cache-size=2M,cache-clean-interval=900,file=disk.qcow2' ....

在我理解为什么 raw 格式不起作用以及是否真的是解决该问题的唯一可能方法之前,我不会接受它。

要修复这个错误,图像应该有 515585 字节或更多,我不知道这个数字是从哪里来的,我测试了几种组合直到达到这个结果,如果你尝试少一个字节它不会工作,但更多字节工作正常。

truncate -s515585 boot.bin