【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の起動順序は

  1. BIOS起動(FlashからPowerOn Resetで読み込み)
  2. BIOSが規程の起動順序でIPLをロードして起動
  3. IPLが任意のストレージからプログラム本体(今回はOS)を読み込み起動

ってな感じになります。
特権モードやら通常モードやらの切り替えは上記のプログラム本体起動後の話ですな。
BIOSは文字通り基本的な入出力をサポートするプログラムなんやけど、PowerOn Reset時にDRAMや各種外部デバイスのレジスタ設定を行う事がメインのお仕事です。最近じゃBIOSが高機能になって、起動手順やらUSBなんかの高レベルデバイスのサポートやらをやってくれる上に、画面モードも複数サポートしてたりするんやけど、一番基本的な事はバスステートコントローラの設定、メモリの設定、DMA等CPU外デバイスの設定、CPUの設定といったハードウェアのレジスタ設定なんですわ。この点では組み込みのプロセッサとなんら違いはないわけやね。

今回は取り合えず起動を試しただけなので、もうちょっとおもしろい事ができたらソースを公開しようかと思っとります。さぁて、今度はどこまで飽きずに続くかな?[E:coldsweats01]

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください