🍊

ゼロからのOS自作入門 メモ (Day5)

に公開

こんにちは、kaiwareです。

みかん本Day5(第5章)について、各種用語や詰まった箇所のメモを残す。

前回はこちら。
https://zenn.dev/kaiware0x/articles/mikan-osbook-day4

フォントファイルの埋め込み

GetFont()

// #@@range_begin(hankaku_bin)
extern const uint8_t _binary_hankaku_bin_start;
extern const uint8_t _binary_hankaku_bin_end;
extern const uint8_t _binary_hankaku_bin_size;

const uint8_t* GetFont(char c) {
  auto index = 16 * static_cast<unsigned int>(c);
  if (index >= reinterpret_cast<uintptr_t>(&_binary_hankaku_bin_size)) {
    return nullptr;
  }
  return &_binary_hankaku_bin_start + index;
}
// #@@range_end(hankaku_bin)
  • 埋め込んだhankaku.binファイルは、ソースコード中では_binary_hankaku_bin_*という特別な名前でアクセスできる。
  • hankaku.binには、1bitごとに塗る・塗らない(文字の前景・背景)情報が含まれている。
    • 前景なら1, 背景なら0
  • 引数のchar cは1Byteで文字のIndexを表している
    • 16倍することでhankaku.bin中の実際のStart Indexがわかる
      • 1文字の縦サイズが16pxなので、16px間隔でStart Indexがある

hankaku.txt例:

0x41 'A'
........
...@....
...@....
..@.@...
..@.@...
..@.@...
.@...@..
.@...@..
.@...@..
.@@@@@..
@.....@.
@.....@.
@.....@.
@.....@.
........
........

WriteAscii()

// #@@range_begin(write_ascii)
void WriteAscii(PixelWriter& writer, int x, int y, char c, const PixelColor& color) {
  const uint8_t* font = GetFont(c);
  if (font == nullptr) {
    return;
  }
  for (int dy = 0; dy < 16; ++dy) {
    for (int dx = 0; dx < 8; ++dx) {
      if ((font[dy] << dx) & 0x80u) {
        writer.Write(x + dx, y + dy, color);
      }
    }
  }
}
// #@@range_end(write_ascii)
  • 画面に表示するときには画像座標系になるため、左上から塗るpxを走査していく。
    • 画像座標系:左上が原点で、y軸プラスが下向き
  • 各文字の1行が1Byte(8bit)、縦幅が2Byte(16bit)

各行のビット演算の解説:

ここまでの実行結果(day05d):

day05d 実行結果

コンソール

Consoleクラスは25行分の文字列しか保持しないようになっているため、line 3~26のみ表示される。
(末尾に改行が入っているため、25行目は空白になっている)

day05e 実行結果

QEMUで実行するまで まとめ

cd ~

# C/C++環境のセットアップ
source ~/osbook/devenv/buildenv.sh

# カーネルのビルド
cd ~/workspace/mikanos/kernel
make
# ~/workspace/mikanos/kernel/kernel.elf ができていることを確認する

# edk2環境のセットアップ
cd ~/edk2
source edksetup.sh

# ブートローダーのビルド
build
# ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi ができていることを確認する

# QEMUで実行
~/osbook/devenv/run_qemu.sh ./Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi ~/workspace/mikanos/kernel/kernel.elf

次回

備えよう

GitHubで編集を提案

Discussion