OS作ってますよ
さて、
今の所飽きずに開発してますよ。面白いですねー
リポジトリはここです
UEFI使って独自OS作ってるって記事がネット上にあんまり転がってなくて、割りと大変。
Linuxとか起動すること出来るよーみたいなの載ってるけどね。
というわけで、はりぼてOSの64ビット版、UEFIデビューを目指して頑張って行きたいと思うですねー
(いつ飽きるかわからんですが・・・w)
開発環境
OS:Ubuntu 14.04
コンパイラ:gcc 4.8.2
リンカ: ld 2.24
作ったもの
- ブートローダー(解説は、おるみんさんブログの「ブートローダーは4行で実装される」で読んでくだしあ。こっちのほうが詳しいです)
- 将来的にはブートオプションとかをカーネルローダに渡すことができたら付けられたらいいなー!みたいな。
- カーネルローダー(この記事解説)
- OSにブートローダーからもらった情報で初期化したデータを渡すとかしている
- 現状は、GOP(Graphics Output Protocol)でグラフィックの初期化とフレームバッファ(VRAMの先頭メモリアドレス)の取得。(なんと24ビットカラー!強い!!
- カーネル(OS、解説は後日)
- OS本体!
- メモリマップの取得とUEFIのブートサービスを切る(ExitBootServicesの呼び出し)
- (ココでやっている理由は、メモリマップを取得した直後じゃないとExitBootServicesが動いてくれない仕様なのでとりあえず、という感じ。)
- なんかCentOSもそんな感じでやっているっぽい(どこで見たかは忘れた)ので真似してみました。
- 現状、メモリマップ取得とExitBootServicesを呼ぶソースとカーネル本処理のソースは分けてありますが、モジュール的には1つです
みたいな感じです。
なかなかそれっぽいでしょ?
カタチから入るのもモチベーションだと思うわけですよ。
もちろん、
「俺のOSは3段階じゃなくて2段階でいいよねー 」
「ブートローダーにカーネルロードさせて、カーネルでカーネルローダーが行っている初期化の役割をやってやるぜ!」
とかそういうのも有りじゃねーのかなーと思うので、そこのあたりは思想にお任せします。
現状、UEFIが使えなくなると、画面に変数を表示できなくなるので
newlibを使って、sprintfとOSのグラフィック関数を組み合わせて表示することにします。
で、フォントもUEFIから引き継げない(?)ので、とりあえず今の所は
『30日でできる!OS自作入門』のメモの「C言語で直接フォントを表現」にある素敵ツールを使わせていただきました。(助かってます!!)
(もし、UEFIからフォントデータとかを持ってこれるよ!って情報有ったら教えてくださいなー)
では長くなりましたが、ブートローダーからソースをぺたぺた貼っていきたいと。
このブートローダーは「ブートローダーは4行で実装される」
からパクってきました!(おるみんさんありがとうございます。フル活用させて頂いてます)
後々、テキストファイルにカーネルとカーネルローダーの場所を書いておいて、
そこからロードしてくるように直そうかと。優先度はかなり低め。
このブートローダーは「ブートローダーは4行で実装される」
からパクってきました!(おるみんさんありがとうございます。フル活用させて頂いてます)
後々、テキストファイルにカーネルとカーネルローダーの場所を書いておいて、
そこからロードしてくるように直そうかと。優先度はかなり低め。
ではお次はカーネルローダー。
量的にはボリューム有るように見えたり見えなかったりしますが、やってることは簡単。
GOPを初期化して、ピクセル情報や解像度情報、フレームバッファを取得しているだけです。
大きく分けて、処理は4つ
131行目:ブートオプション(カーネルの起動パス)とイメージハンドルを取得している。
136行目:カーネルの起動情報を格納するメモリを確保。
142行目:GOPの初期化と画面の色々な情報を136で確保したメモリに入れる。
最大で、1024x768の解像度で初期化してほしい
という要求をchangeGraphicModeの第2引数・第3引数に渡している。
最大なので、800x600で起動されても問題ないけど、
GOPの仕様上1024x768以上の解像度は保証されたハズ
150行目:カーネルを起動する
というような流れになっとります。
「この関数の解説をもっと詳しく!」とか要望があれば、もうチョット書きますが無いですよね。
では!