2015年6月20日土曜日

UEFIでOSつくるぞー(ブートローダ・カーネルローダー編)

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行で実装される
からパクってきました!(おるみんさんありがとうございます。フル活用させて頂いてます)
後々、テキストファイルにカーネルとカーネルローダーの場所を書いておいて、
そこからロードしてくるように直そうかと。優先度はかなり低め。

ではお次はカーネルローダー
量的にはボリューム有るように見えたり見えなかったりしますが、やってることは簡単。
GOPを初期化して、ピクセル情報や解像度情報、フレームバッファを取得しているだけです。


大きく分けて、処理は4つ
131行目:ブートオプション(カーネルの起動パス)とイメージハンドルを取得している。
136行目:カーネルの起動情報を格納するメモリを確保。
142行目:GOPの初期化と画面の色々な情報を136で確保したメモリに入れる。
 最大で、1024x768の解像度で初期化してほしい
 という要求をchangeGraphicModeの第2引数第3引数に渡している。
 最大なので、800x600で起動されても問題ないけど、
 GOPの仕様上1024x768以上の解像度は保証されたハズ

150行目:カーネルを起動する

というような流れになっとります。
「この関数の解説をもっと詳しく!」とか要望があれば、もうチョット書きますが無いですよね。

では!

1 件のコメント:

  1. アウトラインフォント描画のサンプルを公開しています。
    https://github.com/tenpoku1000
    私も OS の開発を進めていますが出来るだけ既存のライブラリを使う方針です。

    返信削除