【GCC】 アセンブラの出力形式指定
訳ありでx86系のブートコードを調べています。調査結果そのものはもうちょっと先という事にして、まずブートできるプログラムを作ってみようと考えたわけです。環境としては素のPCを使うのも不便なんで、VirtualBox on ubuntu の仮想マシン環境を使ってみる事にしました。
ホンマはUSBブートとかしたかったんやけど、(USBブートなら他のノートPCとかにもそのまま移植できるから)VirtualBoxではUSBブートをサポートしていないので、FDブートという事にしました。
とまぁ、ここまでの話から察しが付くかとは思うねんけど、最終形としてはポータブルなOSの開発を目指してみてますダ。OSの基本機能は
- メモリ管理
- タスク管理
- デバイス管理
- ファイルシステム
ってな所でしょうか。これらの機能についてそれぞれさらに詳細な仕様が追加されるわけやけど、とりあえず全体が動くようにしてみたいなぁと思うわけです。
そんなこんなで、まずはIPL(Initial Program Loader つまりはブートローダー)を書いてみようと思ったのやけど、問題は開発環境に何を使うかですな。とりあえず面倒な事は嫌いやし、VirtualBox上で動かそうと思ったので、FDのFAT12イメージをそのままアセンブラで出力したいなぁと。
普通にgccのアセンブラを使ってしまうと、ELF形式で出力されてしまって具合が悪い。
ほな、どうすれば良いか?(ようやく、今回のネタの本題ですな)
gcc --nostdlib -Wl,--oformat=binary -o バイナリ名 ソースファイル名
上記のようにすれば、素のバイナリが出力されるという事でした。
つまりELFコンテナではないアセンブラソースに記述されている命令がそのままバイナリで出力されるという事。よし、これで取り合えずVirtualBoxでのFDイメージからの起動が確認できました。
ちなみに通常のPCの起動順序は
- BIOS起動(FlashからPowerOn Resetで読み込み)
- BIOSが規程の起動順序でIPLをロードして起動
- IPLが任意のストレージからプログラム本体(今回はOS)を読み込み起動
ってな感じになります。
特権モードやら通常モードやらの切り替えは上記のプログラム本体起動後の話ですな。
BIOSは文字通り基本的な入出力をサポートするプログラムなんやけど、PowerOn Reset時にDRAMや各種外部デバイスのレジスタ設定を行う事がメインのお仕事です。最近じゃBIOSが高機能になって、起動手順やらUSBなんかの高レベルデバイスのサポートやらをやってくれる上に、画面モードも複数サポートしてたりするんやけど、一番基本的な事はバスステートコントローラの設定、メモリの設定、DMA等CPU外デバイスの設定、CPUの設定といったハードウェアのレジスタ設定なんですわ。この点では組み込みのプロセッサとなんら違いはないわけやね。
今回は取り合えず起動を試しただけなので、もうちょっとおもしろい事ができたらソースを公開しようかと思っとります。さぁて、今度はどこまで飽きずに続くかな?
« 【C/C++】 演算子のオーバーロード | トップページ | 【VirtualBox】 64bit Windows7 RC on VirtualBox 2.1.2 on ubuntu 8.04 LTS »
「GCC」カテゴリの記事
- 【GCC】 アセンブラの出力形式指定(2009.05.06)
この記事へのコメントは終了しました。
« 【C/C++】 演算子のオーバーロード | トップページ | 【VirtualBox】 64bit Windows7 RC on VirtualBox 2.1.2 on ubuntu 8.04 LTS »
コメント