自作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の差分がどこにあるか見ます
- こればっかりは
-
アセンブラ:
nasm
orgas
-
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.