読者です 読者をやめる 読者になる 読者になる

Moiz's journal

プログラミングやFPGAなどの技術系の趣味に関するブログです

「30日でできる!OS自作入門」のHaribote OSをラズベリーパイに移植してみた

本稿について

タイトル通りですが、HariboteOSのラズベリーパイへの移植が一段落したので報告したいと思います。

f:id:uzusayuu:20170211113857j:plain

「30日でできる!OS自作入門」とHaribote OSとは

『30日でできる!OS自作入門』とは2006年に発行された川合秀実氏のOS入門書です。Haribote OSはこの書籍内で作るOSの名前です

30日でできる! OS自作入門 | マイナビブックス

f:id:uzusayuu:20170212040924p:plain

書籍販売ページの内容紹介

プログラミングの基礎からはじめて、30日後にはウィンドウシステムを有する32bitマルチタスクOSをフルスクラッチで作り上げるという入門書。
ビギナーでも無理なく作成できるようPCの仕組み・アセンブラ・Cの解説から始まり、試行錯誤を繰り返しながらアルゴリズムを学びつつ、たのしく自由な雰囲気でOSをゼロから構築していくという、他に類を見ない手法による、趣味と実用と学習を兼ね備えたOS作成の入門書です。

 

この内容紹介の通り非常にユニークかつわかりやすい内容で、発売後10年たった現在も読み継がれています。たとえば最近ではこちらのブログで紹介されているのを目にしました。

rkx1209.hatenablog.com

名前はHaribote(張りぼて)という名称ですが、教育用のOSとしては、割り込み処理、ファイルアクセス、アプリケーションのサポート、メモリーのプロテクション、APIの実装、プリエンプティブなマルチタスクの実装、周辺機器のサポート、GUIの実装と、十分な領域をカバーしていると思います。また、改変したソフトウェアの再配布・ライセンスの変更を認めるなど、このOSをもとに実用的なOSを作成することも理論上は可能になっていて、川合氏のこの分野にかける思いの程が感じられます。

当ブログの筆者もご多分に漏れず、このOS自作入門を用いてOSを『自作』してみたのですが、なにしろ10年前の書籍と言うことで現在のPC環境とは相容れない部分も多くなってきています。たとえばHariboteはフロッピーディスクからの起動を前提にしているのですが、今時フロッピーから起動できるPCを調達するのも大変です。CDからの起動もできますが、毎回焼くのも不便です。なにしろ自作OSは起動するかどうかさえやってみないとわかりません。私自身、エミュレータQEMUやVirtual Box上で動作を確認するのみとなり、少し不満が残る結果となりました。また、内容を移しただけでは無く、自分で考えてOSを作りたいという気持ちも強まり、では他のアーキテクチャーに移植して実機上で動作してみよう、という事にしました。

 

ラズベリーパイへの移植

 簡単に移植といっても、まったくアーキテクチャーの違うCPU、プラットフォームへの移植と言うことで、変更点は多岐にわたります。特にアセンブラ部分は当然ながらすべて書き換えになりましたし、CのコードもCPUの機能やプラットフォームの機能に関わる部分は全て又は大きく変更しました。以下に主要な変更点を挙げます

  • ツールチェーンをHaribote独自の物からGNUに置き換え
  • ツールチェーンの変更に伴い一部の処理(sprintf, rand)を自作の関数で置き換え
  • アセンブラのコードをx86からARMv6に全て変更
  • ブートローダーをRaspberry Piの標準の物に置き換え
  • 割り込み処理の書き換え
  • TSSによるマルチタスクをソフトウェアによるレジスタの待避・復帰に変更
  • マルチタスクの処理の変更に伴い、スーパーバイザーモードおよびシステムモード用のスタックをタスク毎に設定
  • セグメントをページングによって置き換え(ARMにはセグメントはない)
  • ファイルアクセスをBIOSによるフロッピーディスクの読み込みから、OS内のSDCARDの読み込みに変更
  • ファイルシステムFAT12からFAT16に変更
  • タイマー処理の全面的な書き直し
  • キーボードとマウスの処理を外部USBデバイスドライバCSUD)により置き換え
  • キーボードとマウスの割り込み処理をタイマー割り込み時のポーリングに変更(CSUDの制限による)

  • グラフィック処理の移植。特に初期化作業は完全に書き換え
  • 音声の処理をブザーからPWMに変更。具体的にはPWMをM/Sモードで動作させ、クロックを可聴領域まで落とすことでブザーと似た音声を出力させ、パルスの周期を変えることで音程を実現しています。
  • システムコールをスーパーバイザーコールに置き換えて、上記のマルチタスク変更に対応させる
  • デバッグ用にUARTおよびJTAGに対応
  • 実行ファイルの形式をHRB形式からELF形式に変更。これにともないスタックとヒープのサイズを固定値に置き換え(今後変更を検討)
  • CPUのアーキテクチャーの違いによる小さな差異を吸収(例:ARMの32ビットアクセスは4バイトアラインのため、画像描画の高速化がもとのままでは失敗することがあった)

逆に変わっていない点としては、

  • GUI、キーバインディングに関してはもとのHariboteを踏襲
  • アプリケーションはCのソースコードレベルで互換性あり
  • 「30日で出来る!OS自作入門」に登場するアプリケーションは、グラフィックビューワー以外は全て動作する(TVIEWのみ後述のバグによる制限あり。グラフィックビューワーはアセンブラ部分があるため)

現在わかっている問題点・制限としては

  • Raspberry Pi Model B+ Rev2.0でのみ動作検証済み(ラズベリーパイ2への拡張を検討中)-> 2/25 Raspberry Pi Zeroでの動作を確認しました。
  • 使用したSDCARDのサンプルファイルにバグがあることがわかっている(検討中)-> 2/25 わかっている範囲で対応済み
  • CSUDの制限のため、キーボード・マウスに関しては、動作する機種が限られる。(今までのところケーブル接続のものは動く確率が高い)
  • アプリケーションの一つ(TVIEW)が、オプションをつけるとクラッシュする。(おそらくメモリー関係の問題。検討中)  2/19 修正済み
  • 圧縮の解凍がまだサポートされていない(これは、2017年現在、数百バイトの圧縮にどれほどの価値があるのか疑問だったためプライオリティーを下げた。今後対応予定)
  • 非矩形ウィンドウの表示時に透明部分が正しく描写されない(ウィンドウの位置を動かせば正しく表示される。検討中)
  • FAT16のサポートが最小限なため、環境によっては動かない可能性がある(拡張を検討中)-> 2/25 FAT32に対応しました
  • ELF形式の実行ファイルのサポートが最小限なため、環境によっては動かない可能性がある(拡張を検討中)

ソースコードはすべてGithubに公開しています。再配布・再ライセンスを事実上制限無く許諾してくださっている川合氏の前例にならい、ライセンスとしては改変・再頒布にほぼ制限のないunlicenseを選択しました。

github.com

使用方法などはGithub内のWikiに投稿してあります。今後ビルド方法なども追加する予定です。

スクリーンショットなど

以下、スクリーンショットなどを載せておきます。残念ながらオリジナルのHariboteと全く同じです。異なるアーキテクチャー上にまったく同じ物を再現するのがテーマだったのでしかたがないのですが、すこし寂しいところです。

f:id:uzusayuu:20170211123719j:plain

この写真中tviewが表示しているipl10.nasはテキストのサンプルとして使っているだけで、OS内では使用していません。

f:id:uzusayuu:20170211123847j:plain

動画はこちら

www.youtube.com

音楽の再生が調子っぱずれなのはマルチタスクの影響だと思いますが、まだバグが残っているのかもしれません。

参考文献・サイトなど

以下、Haribote OSのラズベリーパイへの移植にあたって使用した参考文献・サイトのうちいくつかを紹介します。これらの書籍およびウェブサイトの著者の方にはあらためて感謝の気持ちをあらわしたいと思います。

「30日でできる!OS自作入門」

30日でできる! OS自作入門 | マイナビブックス

f:id:uzusayuu:20170212040924p:plain

 すでに説明しましたので、詳細は省きますが、改めてOSを学ぶ機会を与えていただいたことを感謝したいと思います。ゼロからOSを作り上げるというスタイルのため、他のアーキテクチャーへの移植も一歩ずつ進めることが出来ました

 

Cambridge University - Baking Pi - Operating Systems Development

Computer Laboratory – Raspberry Pi: Baking Pi – Operating Systems Development

 最初にラズベリーパイでベアメタル・プログラミング(OSを使わない、ハードウェア上の低レイヤーのプログラミング)をするにあたって使ったチュートリアルです。CSUDはこちら経由で入手しました。

 

Raspberry Pi respository by dwelch67

github.com

いろいろなラズベリーパイのベアメタル・プログラミングの例が載っていて、あたらしいステップに進む度に参考にしました。

 

Valver Bare Metal Programming

www.valvers.com

わかりやすいチュートリアルです。特にMailbox(ラズベリーパイでVideo coreなどと情報をやりとりする仕組み)について非常に参考になりました

 

 OSDev Wiki - Raspberry Pi Bare Bones

Raspberry Pi Bare Bones - OSDev Wiki

 OSDevにもラズベリーパイのベアメタル(ここではBare boneと呼ばれています)についての情報があります。

 

Raspberry Pi - Bare Metal Forum

Raspberry Pi • View forum - Bare metal

 本家ラズベリーパイのサイトにも当然ながらベアメタルのForumがあります。

 

BareMetalで遊ぶ Raspberry Pi

tatsu-zine.com

 貴重な日本語の情報。表紙はかわいらしいですが、中身はすべてラズベリーパイのベア・メタルプログラミングに関するものです。JTAGを使ったデバッグの方法が非常に参考になりました

 

32ビットコンピュータをやさしく語る はじめて読む486

www.amazon.co.jp

オリジナルのHariboteの動作を理解するにあたって非常にためになりました。Githubリポジトリーがあり、現代のPC環境でサンプルコードを実行する手引きが解説されています。

github.com

改訂ARMプロセッサ-32ビットRISCのシステム・アーキテクチャ

改訂 ARMプロセッサ

書籍ページの紹介

本書は,組み込み用RISC型マイクロプロセッサとして広く普及しているARMプロセッサの解説書です.ARMプロセッサの開発当初から関わってきた著者(マンチェスター大学)が,RISCプロセッサの歴史を振り返りながら,ARMアーキテクチャを詳細にわかりやすく解説していきます.改訂版では,旧版で扱っていたARM7TDMI,ARM8の各コアに加えて,ARM9TDMI,ARM9E,ARM10TDMI,ARM10Eなどの新しいコアについても触れられています.また,RISCプロセッサの原理を学ぶ教科書としても最適です.
 原書名:ARM System-on-chip Architecture (second edition)

 絶版のようなので、当初参考文献にいれていたなかったのですが、最も良く参照した本の一つなのと、アマゾンなどで手に入るようなので加えておきます。

実をいうと10年程前に買ったっきり開いていなかったのですが、今回はとても重宝しました。特にヴァーチャルアドレッシングの説明はわかりやすく助かりました。2001年の本と言うことで今となっては内容に古い部分もありますが、そういった部分の多くは拡張部分なので現代のアップデートと共に読めば今でも参考になります。

ARM Information center

ARM Information Center

Welcome to the ARM Infocenter. The Infocenter contains all ARM non-confidential Technical Publications, including:

ARMの情報ページです。ARM自体に関わる事はここで多くの情報が得られます。

まとめ

「30日でできる!OS自作入門」のHaribote OSをラズベリーパイに移植したので、その内容を報告しました。移植した結果はGithubで公開済みです。

 

修正

当初、川合氏の名前を誤表記していたことをブックマークにして指摘頂きましたので修正しました。川合氏には大変失礼いたしました。またご指摘ありがとうございます。

(2/19)参考文献を追加しました。tview関連のバグが修正されたのでその旨表記しました