From b3eace12608d9def1a996f5e2e46549858ba76c4 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Mon, 12 Apr 2021 10:46:33 +0200 Subject: [PATCH] Explain how to run the disk images in QEMU (both BIOS and UEFI) --- .../edition-3/posts/02-booting/index.md | 23 ++++++++++++------ .../edition-3/posts/02-booting/qemu-bios.png | Bin 0 -> 14037 bytes .../edition-3/posts/02-booting/qemu-uefi.png | Bin 0 -> 14832 bytes 3 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 blog/content/edition-3/posts/02-booting/qemu-bios.png create mode 100644 blog/content/edition-3/posts/02-booting/qemu-uefi.png diff --git a/blog/content/edition-3/posts/02-booting/index.md b/blog/content/edition-3/posts/02-booting/index.md index f67b8f9b..b53094e1 100644 --- a/blog/content/edition-3/posts/02-booting/index.md +++ b/blog/content/edition-3/posts/02-booting/index.md @@ -518,26 +518,33 @@ qemu-system-x86_64 -drive \ As a result, you should see a window open that looks like this: -TODO: QEMU screenshot +![QEMU printing several `INFO:` log messages](qemu-bios.png) -This output comes from the bootloader. As we see, the last line is "Jumping to kernel entry point at […]". This is the point where the `_start` function of our kernel is called. Since we currently only `loop {}` in that function nothing else happens, so it is expected that we don't see any additional output. +This output comes from the bootloader. As we see, the last line is _"Jumping to kernel entry point at […]"_. This is the point where the `_start` function of our kernel is called. Since we currently only `loop {}` in that function nothing else happens, so it is expected that we don't see any additional output. -Running the UEFI disk image works in a similar way, but we need to pass some additional files to QEMU to emulate an UEFI firmware. This is necessary because QEMU does not support emulating an UEFI firmware natively. The files that we need are provided by the [Open Virtual Machine Firmware (OVMF)][OVMF] project, which implements UEFI support for virtual machines. Unfortunately, the project is only very sparsely documented and not even has a clear homepage. +Running the UEFI disk image works in a similar way, but we need to pass some additional files to QEMU to emulate an UEFI firmware. This is necessary because QEMU does not support emulating an UEFI firmware natively. The files that we need are provided by the [Open Virtual Machine Firmware (OVMF)][OVMF] project, which is a sub-project of [TianoCore] and implements UEFI support for virtual machines. Unfortunately, the project is only [sparsely documented][ovmf-whitepaper] and does not even have a clear homepage. -[OVMF]: http://www.linux-kvm.org/downloads/lersek/ovmf-whitepaper-c770f8c.txt +[OVMF]: https://github.com/tianocore/tianocore.github.io/wiki/OVMF +[TianoCore]: https://www.tianocore.org/ +[ovmf-whitepaper]: https://www.linux-kvm.org/downloads/lersek/ovmf-whitepaper-c770f8c.txt -The easiest way to work with OVMF is to download pre-built images of the code. We provide such images at TODO. Both the `OVMF_CODE.fd` and `OVMF_VARS.fd` files are needed, so download them to a directory of your choice. Using these files, we can then run our UEFI disk image using the following command: +The easiest way to work with OVMF is to download pre-built images of the code. We provide such images in the [`rust-osdev/ovmf-prebuilt`] repository, which is updated daily from [Gerd Hoffman's RPM builds](https://www.kraxel.org/repos/). The compiled OVMF are provided as [GitHub releases][ovmf-prebuilt-releases]. + +[`rust-osdev/ovmf-prebuilt`]: https://github.com/rust-osdev/ovmf-prebuilt/ +[ovmf-prebuilt-releases]: https://github.com/rust-osdev/ovmf-prebuilt/releases/latest + +To run our UEFI disk image in QEMU, we need the `OVMF_pure-efi.fd` file (other files might work as well). After downloading it, we can then run our UEFI disk image using the following command: ``` qemu-system-x86_64 -drive \ format=raw,file=target/x86_64-blog_os/debug/bootimage-uefi-blog_os.img \ - -drive if=pflash,format=raw,file=/path/to/OVMF_CODE.fd, - -drive if=pflash,format=raw,file=/path/to/OVMF_VARS.fd, + -bios /path/to/OVMF_pure-efi.fd, ``` If everything works, this command opens a window with the following content: -TODO: QEMU UEFI screenshot + +![QEMU printing several `INFO:` log messages](qemu-uefi.png) The output is a bit different than with the BIOS disk image. Among other things, it explicitly mentions that this is an UEFI boot right on top. diff --git a/blog/content/edition-3/posts/02-booting/qemu-bios.png b/blog/content/edition-3/posts/02-booting/qemu-bios.png new file mode 100644 index 0000000000000000000000000000000000000000..b79ec729e7b11acaacf227bf20693386f481e947 GIT binary patch literal 14037 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