Edited at

Debian GNU/Linuxで自作OS

More than 1 year has passed since last update.

自作OS Advent Calendar 2016 10日目の @Hiroyuki-Nagata です.

前の人は 川合さんでした(!),次の人は たぶん自分です.


LinuxでOS自作入門していくことの位置づけ

まず、30日でできるOS自作入門の本はターゲットがWindows環境のため、それをそのままLinux環境で行うことは難しいです。以下の部分において、ツールをOSSのもので代用するか自作することがネット上ではよく見られます。


  • アセンブラ … nasmgas で代用

  • リンカ … ld のリンカスクリプトを使う

  • イメージファイル書き込みツール … 自作 or mtoolsddとかでもできる?

OS自作入門は、OSを一から作るときの定石を用意してくれているという認識です。

この本が無ければそもそもの目標設定から難しかったでしょう。


LinuxでOS自作入門していくための環境

次に、どのような道具を使ってOS自作していくかという話:


  • エディタ



    • Emacsを使っています、Vimでもいいでしょう、Atomとかでもいいんじゃないでしょうか(適当)



  • バイナリエディタ



    • Emacshexl-modeを使います




  • バイナリをテキストにするコマンド


    • ここは結構重要です、アセンブラでオブジェクトファイルを作ったり、イメージファイルを出した後

    • 生のバイナリだとデバッグがしにくいので、以下のコマンドで16進数およびリトルエンディアンのファイルを出せます。

    • $ od -t x1 hello.bin > hello.hex




  • Diffツール


    • こればっかりはEmacsのdiffが見づらいので、meldというのを使っています

    • Osaskの本家サイトもしくはCDからバイナリ版のツールを取得してwineで実行、出てきたオブジェクトファイルをodにかけて自分の作ったバイナリと本家osaskの差分がどこにあるか見ます




  • アセンブラ:nasm or gas



    • naskはインテル記法なので気になるアセンブラの出力はnasmで同じものを書いてみて比較してみたりします




  • Qemu


    • 最終的なイメージファイルを食わせて実行するために必要、Linuxだと # apt-get install qemu で入るから楽ですね



これだけ使い方を覚えてしまえば、後は本を読んでガリガリ書いていくだけです。


わたしのOS自作入門

結局わたしは、「既存のnask形式ファイルは使いまわしたいけれど、naskは使いたくない」というわがままな希望で、naskを機能のみクローンしていくことにしました。やってみると非常につらい(勉強にはなるが)。そのへんの実装でわかった気づきも書きたいところですが。



  • そこで作ったのが以下のリポジトリです




  • 特徴



    • C++CMakeで出来てます


    • C++はC++11で設定してます


    • CMakeのターゲット名を叩くとosaskのproject以下のファイルを全部ビルドします(現状は5日目まで動作確認済み)


    • CMakeを導入したのでAutotoolsよりだいぶビルドが早いです

    • 構文解析にはParasol というオープンソースのライブラリを使いました

    • 数値計算はtinyexprを使いました

    • Windows版のコマンドライン引数処理にはtakamin/win-cを使いました

    • 機能はもちろんnaskを参考にしました、すみません




  • 動作環境


    • 基本はLinux環境で動かします、gcc-4.9以上が推奨です


      • 開発環境はDebianですが、Ubuntuでも普通に動くと思います、詳しくはTravisの設定ファイルを見てください



    • Windowsビルドはclang-clで回してますが、mtoolsのWindows対応をしてないので自作OSのファイルはビルドできません




  • コメント



    • C++はクロスコンパイルしにくいので、どこかのタイミングでGO言語に書き換えたいと思ってます。GO言語に書き換えられれば、Windows, Linux, Mac 果ては Plan9, Naclでも動くらしいので…


    • opennask 本体のファイルサイズは結構でかいと思います、ただし実装は平易なので読んだら機能がわかるんじゃないでしょうか


    • yaccpegのような言語作成用ライブラリを使うべきだったと後悔している




ビルドツールチェイン

以下が、いろいろ検討して作ったビルドの流れ図です。

build-chain.png



  • obj2bim はもともとldのようなリンカと同じ動き(オブジェクトファイルをまとめる)をしています



    • .bimおよび.hrbはそれぞれ緻密な計算でファイルの形式が決まっています


    • ldは与えられたオブジェクトファイルをスクリプトで並べかえることができます

    • それを使って一気に.hrb形式に変換します



  • boot.binhead.binは単純にcatでくっつけてharibote.sysとします


  • haribote.sysmtoolでフロッピーディスクに書き込みます



振り返り

OS自作入門の流れを改めて確認してみます

✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌ 画面出るの楽しい!


1日目 フロッピーディスク相当のデータを手打ち

画像ナシ


2日目 ブートローダーをアセンブラで書く

画像ナシ


3日目 C言語とアセンブラの連携、リンカを使用する

harib00j.png


4日目 かんたんな画面描画

harib01d.png


5日目 かんたんな画面描画+文字描画

harib02a.png


今後の展望


  • GO言語への移植(yaccpegを使う)

  • カーネルを書く


  • GUIのフレームワーク導入

  • インターネット接続 ...etc.