「12 ステップで作る 組込みOS自作入門」 を読んでOS を作成してみた

- OS Kernel C

概要

12 ステップで作る 組込み OS 自作入門 を読んで、マイコン (H8/3069Fネット対応マイコンLANボード(完成品)) のリソースを管理する小さな OS (marinOS) を実装してみました。 割り込みベースでスレッドが切り替わる OS で、いわゆるマイクロカーネルのような思想で実装しています。この本を読んで実装したことを通して学んだことなどの感想を簡単に残したいと思います。なお、本記事は個人の見解であり、所属組織を代表するものではありません。

感想と勉強になったこと

この書籍をベースに小さな OS を作成することで学べたことなどを以下に示します。

  1. 必要に応じて仕様書を読み込むことの大切さ (H8/3069 F-ZTAT TM ハードウェアマニュアル, XMODEM, Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification Version 1.2, etc …)
  2. C 言語 / アセンブリ言語 / スタックの伸長などの低レイヤーの基本
  3. リンカスクリプトを使用したコードやメモリ配置の調整方法
  4. 標準ライブラリを一切使用せずにフルスクラッチで必要な処理の実装方法
  5. デバイスドライバのような機能の実装方法
  6. Bootloader の実装方法
  7. ファイル転送プロトコル (XMODEM) の実装方法
  8. ELF ファイルを解析し RAM 上の指定した領域へ展開して起動させるための機能の実装方法
  9. 割り込み処理の実装方法
  10. 複数のスレッドを起動させ、優先度に応じてスレッドをスケジューリングさせる機能の実装方法
  11. メモリ管理の機能の実装方法
  12. IPC の機能の実装方法
  13. ビジーループではなく外部割り込みを捌く処理の実装方法

この書籍自体は割と古めの本なのですが、このような OS (Kernel) の基本的な機能やマイコンプログラミングの基礎を学べたのは貴重な経験でした。個人的には GUI の複雑なレンダリング処理の実装等の必要が無く、外部のライブラリに依存することなく OS (Kernel) の機能の実装に注力することができたので、学生の頃に読んだ ゼロからの OS 自作入門 よりは取っ付きやすかったです。また、マイコンのメモリを直接的かつ自由に取り扱うことができたので、メモリ管理に対する苦手意識が減り、メモリモデルに関する関心が芽生えました。なお、ゼロからの OS 自作入門 もすごいたくさんのことを学べた本なので、時間があるうちに再度読み直したいと考えています。先にこの本を読んでいれば、また見方が変わったのかなとも思います。

最後に

前半は環境構築と仕様書の読み方が一番大変だったのですが、後半は OS (Kernel) の本格的な機能を実装したのでかなり読み応えがありました。特に、割り込みによって処理が非同期的に飛ぶ辺りやメモリ管理機能の実装には手こずりました。この本を通して自分は低レイヤーではどのようなデータ構造やアルゴリズムを駆使してリソースが管理されているのか (ex. 動的なメモリの割り当てやスレッドのスケジューリングや排他制御など) に気づきました。そのため、これからはこの OS (Kernel) を拡張しつつ、他の OS (Kernel) のリソース管理がどのようなデータ構造やアルゴリズムを用いて管理されているかを調査してみたいと思います。

参考