snaka; home - uchan-nos/os-from-zero GitHub Wiki

自己紹介

環境

  • 開発環境: Windows10 WSL2 (Ubuntu-20.04)
  • テスト環境: QEMU

準備

前提

  • WSL2 の環境は用意済み
  • X Server (VcXsrv) インストール済み

ディレクトリ構成

$HOME/edk2
$HOME/osbook
$HOME/workspace/mikanos

X Server 起動

XLaunch を実行

"start no client" を選択

"Disable access control" を選択

読書記録

ページテンプレート

[[home|snaka;-home]]

Tips

WSL から Windows のクリップボードにコピー

git diff で差分を見る

「3.3 初めてのカーネル(osbook_day03a)」 と「3.4 ブートローダからピウセルを描く(osbook_day03b)」の差分を確認したい場合以下のコマンドで確認できる。

$ git diff osbook_day03a..osbook_day03b
実行結果
diff --git a/MikanLoaderPkg/Main.c b/MikanLoaderPkg/Main.c
index f7f50be..e214c58 100644
--- a/MikanLoaderPkg/Main.c
+++ b/MikanLoaderPkg/Main.c
@@ -2,6 +2,7 @@
 #include  <Library/UefiLib.h>
 #include  <Library/UefiBootServicesTableLib.h>
 #include  <Library/PrintLib.h>
+#include  <Library/MemoryAllocationLib.h>
 #include  <Protocol/LoadedImage.h>
 #include  <Protocol/SimpleFileSystem.h>
 #include  <Protocol/DiskIo2.h>
@@ -108,6 +109,48 @@ EFI_STATUS OpenRootDir(EFI_HANDLE image_handle, EFI_FILE_PROTOCOL** root) {
   return EFI_SUCCESS;
 }
 
+EFI_STATUS OpenGOP(EFI_HANDLE image_handle,
+                   EFI_GRAPHICS_OUTPUT_PROTOCOL** gop) {
+  UINTN num_gop_handles = 0;
+  EFI_HANDLE* gop_handles = NULL;
+  gBS->LocateHandleBuffer(
+      ByProtocol,
+      &gEfiGraphicsOutputProtocolGuid,
+      NULL,
+      &num_gop_handles,
+      &gop_handles);
+
+  gBS->OpenProtocol(
+      gop_handles[0],
+      &gEfiGraphicsOutputProtocolGuid,
+      (VOID**)gop,
+      image_handle,
+      NULL,
+      EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
+
+  FreePool(gop_handles);
+
+  return EFI_SUCCESS;
+}
+
+const CHAR16* GetPixelFormatUnicode(EFI_GRAPHICS_PIXEL_FORMAT fmt) {
+  switch (fmt) {
+    case PixelRedGreenBlueReserved8BitPerColor:
+      return L"PixelRedGreenBlueReserved8BitPerColor";
+    case PixelBlueGreenRedReserved8BitPerColor:
+      return L"PixelBlueGreenRedReserved8BitPerColor";
+    case PixelBitMask:
+      return L"PixelBitMask";
+    case PixelBltOnly:
+      return L"PixelBltOnly";
+    case PixelFormatMax:
+      return L"PixelFormatMax";
+    default:
+      return L"InvalidPixelFormat";
+  }
+}
+
+
 EFI_STATUS EFIAPI UefiMain(
     EFI_HANDLE image_handle,
     EFI_SYSTEM_TABLE* system_table) {
@@ -128,7 +171,25 @@ EFI_STATUS EFIAPI UefiMain(
   SaveMemoryMap(&memmap, memmap_file);
   memmap_file->Close(memmap_file);
 
-  // #@@range_begin(read_kernel)
+  // #@@range_begin(gop)
+  EFI_GRAPHICS_OUTPUT_PROTOCOL* gop;
+  OpenGOP(image_handle, &gop);
+  Print(L"Resolution: %ux%u, Pixel Format: %s, %u pixels/line\n",
+      gop->Mode->Info->HorizontalResolution,
+      gop->Mode->Info->VerticalResolution,
+      GetPixelFormatUnicode(gop->Mode->Info->PixelFormat),
+      gop->Mode->Info->PixelsPerScanLine);
+  Print(L"Frame Buffer: 0x%0lx - 0x%0lx, Size: %lu bytes\n",
+      gop->Mode->FrameBufferBase,
+      gop->Mode->FrameBufferBase + gop->Mode->FrameBufferSize,
+      gop->Mode->FrameBufferSize);
+
+  UINT8* frame_buffer = (UINT8*)gop->Mode->FrameBufferBase;
+  for (UINTN i = 0; i < gop->Mode->FrameBufferSize; ++i) {
+    frame_buffer[i] = 255;
+  }
+  // #@@range_end(gop)
+
   EFI_FILE_PROTOCOL* kernel_file;
   root_dir->Open(
       root_dir, &kernel_file, L"\\kernel.elf",
@@ -149,7 +210,6 @@ EFI_STATUS EFIAPI UefiMain(
       (kernel_file_size + 0xfff) / 0x1000, &kernel_base_addr);
   kernel_file->Read(kernel_file, &kernel_file_size, (VOID*)kernel_base_addr);
   Print(L"Kernel: 0x%0lx (%lu bytes)\n", kernel_base_addr, kernel_file_size);
-  // #@@range_end(read_kernel)
 
   // #@@range_begin(exit_bs)
   EFI_STATUS status;

現在 checkout されている tag を調べる

$ git describe --tags

トラブルシュート

参考文献

⚠️ **GitHub.com Fallback** ⚠️