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
XLaunch を実行
"start no client" を選択
"Disable access control" を選択
- 第1章 PC の仕組みとハローワールド
- 第2章 EDKⅡ 入門とメモリマップ
-
ブートローダのビルド
$ cd ~/edk2 $ source ~/.profile $ source edksetup.sh $ build
QEMU で実行
$ ~/osbook/devenv/run_qemu.sh Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi ~/workspece/mikanos/kernel/kernel.elf
-
- 第3章 画面表示の練習とブートローダ
-
kernel のビルド
$ cd ~/workspace/mikanos/kernel $ source ~/osbook/devenv/buildenv.sh $ make
-
- 第4章 ピクセル描画とmake入門
- 第5章 文字表示とコンソールクラス
- 第6章 マウス入力とPCI
- 第7章 割り込みとFIFO
- 第8章 メモリ管理
- 第9章 重ね合わせ処理
- 第10章 ウィンドウ
- 第11章 タイマとACPI
- 第12章 キー入力
- 第13章 マルチタスク(1)
- 第14章 マルチタスク(2)
- 第15章 ターミナル
- ここまでの整理
- 第16章 コマンド
- 第17章 ファイルシステム
- 第18章 アプリケーション
-
kernel とアプリケーションをまとめてビルドし、その結果を QEMU で実行する方法
$ source ~/.profile $ source ~/osbook/devenv/buildenv.sh $ cd ~/workspace/mikanos # カーネルとアプリケーションの make と QEMU の起動まで $ ./build.sh run
-
- 第19章 ページング
- 第20章 システムコール
- 第21章
- 第22章
- 第23章
- 第24章
- 第25章
- 第26章
- 第27章
- 第28章
- 第29章
- 第30章
[[home|snaka;-home]]
「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;
$ git describe --tags
- intel 64 and IA-32 Architectures Software Developer' s Manual - 2019 年 Intel Corporation