From ff3f055383ecdde6033bb7f5008b92935ed5d6b3 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 19 Mar 2021 14:35:25 +0100 Subject: [PATCH] Add QEMU screenshot --- .../content/edition-3/posts/02-booting/index.md | 4 ++-- .../posts/02-booting/{uefi.md => uefi/index.md} | 2 +- .../posts/02-booting/uefi/minimal-uefi-qemu.png | Bin 0 -> 19845 bytes 3 files changed, 3 insertions(+), 3 deletions(-) rename blog/content/edition-3/posts/02-booting/{uefi.md => uefi/index.md} (99%) create mode 100644 blog/content/edition-3/posts/02-booting/uefi/minimal-uefi-qemu.png diff --git a/blog/content/edition-3/posts/02-booting/index.md b/blog/content/edition-3/posts/02-booting/index.md index 9666da0d..966c0e48 100644 --- a/blog/content/edition-3/posts/02-booting/index.md +++ b/blog/content/edition-3/posts/02-booting/index.md @@ -13,7 +13,7 @@ icon = ''' ''' -extra_content = ["uefi.md"] +extra_content = ["uefi/index.md"] +++ In this post, we explore the boot process on both BIOS and UEFI-based systems. We combine the [minimal kernel] created in the previous post with a bootloader to create a bootable disk image. We then show how this image can be started in the [QEMU] emulator and run on real hardware. @@ -148,7 +148,7 @@ As it is probably clear at this point, the UEFI interface is very powerful and c To keep this post focused, we won't cover the creation of an UEFI bootloader here. Instead, we will use the already mentioned [`bootloader`] crate, which allows loading our kernel on both UEFI and BIOS systems. If you're interested in how to create an UEFI bootloader yourself, check out our extra post about [**UEFI Booting**]. -[**UEFI Booting**]: @/edition-3/posts/02-booting/uefi.md +[**UEFI Booting**]: @/edition-3/posts/02-booting/uefi/index.md ### The Multiboot Standard diff --git a/blog/content/edition-3/posts/02-booting/uefi.md b/blog/content/edition-3/posts/02-booting/uefi/index.md similarity index 99% rename from blog/content/edition-3/posts/02-booting/uefi.md rename to blog/content/edition-3/posts/02-booting/uefi/index.md index 92e8aa54..0af21dd5 100644 --- a/blog/content/edition-3/posts/02-booting/uefi.md +++ b/blog/content/edition-3/posts/02-booting/uefi/index.md @@ -436,7 +436,7 @@ The result of this command is a `.fat` and a `.img` file next to the given `.efi [run-instructions]: @/edition-3/posts/02-booting/index.md#running-our-kernel -TODO screenshot +![QEMU screenshot showing some UEFI firmware output](minimal-uefi-qemu.png) We don't see any output from our `uefi_app` on the screen yet since we only `loop {}` in our `efi_main`. Instead, we see some output from the UEFI firmware itself that was created before our application was started. diff --git a/blog/content/edition-3/posts/02-booting/uefi/minimal-uefi-qemu.png b/blog/content/edition-3/posts/02-booting/uefi/minimal-uefi-qemu.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0e7973df917c87bd6a5456409042755da09b84 GIT binary patch literal 19845 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 literal 0 HcmV?d00001