自作OS Advent Calendar 2016 10日目の @Hiroyuki-Nagata です.
前の人は 川合さんでした(!),次の人は たぶん自分です.
LinuxでOS自作入門していくことの位置づけ
まず、30日でできるOS自作入門の本はターゲットがWindows環境のため、それをそのままLinux環境で行うことは難しいです。以下の部分において、ツールをOSSのもので代用するか自作することがネット上ではよく見られます。
- アセンブラ …
nasmかgasで代用 - リンカ …
ldのリンカスクリプトを使う - イメージファイル書き込みツール … 自作 or
mtools、ddとかでもできる?
OS自作入門は、OSを一から作るときの定石を用意してくれているという認識です。
この本が無ければそもそもの目標設定から難しかったでしょう。
LinuxでOS自作入門していくための環境
次に、どのような道具を使ってOS自作していくかという話:
-
エディタ
-
Emacsを使っています、Vimでもいいでしょう、Atomとかでもいいんじゃないでしょうか(適当)
-
-
バイナリエディタ
-
Emacsのhexl-modeを使います
-
-
バイナリをテキストにするコマンド
- ここは結構重要です、アセンブラでオブジェクトファイルを作ったり、イメージファイルを出した後
- 生のバイナリだとデバッグがしにくいので、以下のコマンドで16進数およびリトルエンディアンのファイルを出せます。
$ od -t x1 hello.bin > hello.hex
-
Diffツール
- こればっかりは
Emacsのdiffが見づらいので、meldというのを使っています - Osaskの本家サイトもしくはCDからバイナリ版のツールを取得して
wineで実行、出てきたオブジェクトファイルをodにかけて自分の作ったバイナリと本家osaskの差分がどこにあるか見ます
- こればっかりは
-
アセンブラ:
nasmorgas-
naskはインテル記法なので気になるアセンブラの出力はnasmで同じものを書いてみて比較してみたりします
-
-
Qemu- 最終的なイメージファイルを食わせて実行するために必要、Linuxだと
# apt-get install qemuで入るから楽ですね
- 最終的なイメージファイルを食わせて実行するために必要、Linuxだと
これだけ使い方を覚えてしまえば、後は本を読んでガリガリ書いていくだけです。
わたしの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のファイルはビルドできません
- 基本はLinux環境で動かします、
-
コメント
-
C++はクロスコンパイルしにくいので、どこかのタイミングでGO言語に書き換えたいと思ってます。GO言語に書き換えられれば、Windows,Linux,Mac果てはPlan9,Naclでも動くらしいので… -
opennask本体のファイルサイズは結構でかいと思います、ただし実装は平易なので読んだら機能がわかるんじゃないでしょうか -
yaccやpegのような言語作成用ライブラリを使うべきだったと後悔している
-
ビルドツールチェイン
-
obj2bimはもともとldのようなリンカと同じ動き(オブジェクトファイルをまとめる)をしています-
.bimおよび.hrbはそれぞれ緻密な計算でファイルの形式が決まっています -
ldは与えられたオブジェクトファイルをスクリプトで並べかえることができます - それを使って一気に
.hrb形式に変換します
-
-
boot.binとhead.binは単純にcatでくっつけてharibote.sysとします -
haribote.sysをmtoolでフロッピーディスクに書き込みます
振り返り
OS自作入門の流れを改めて確認してみます
✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌ 画面出るの楽しい!
1日目 フロッピーディスク相当のデータを手打ち
画像ナシ
2日目 ブートローダーをアセンブラで書く
画像ナシ
3日目 C言語とアセンブラの連携、リンカを使用する
4日目 かんたんな画面描画
5日目 かんたんな画面描画+文字描画
今後の展望
- GO言語への移植(
yaccやpegを使う) - カーネルを書く
- GUIのフレームワーク導入
- インターネット接続 ...etc.



