フロッピーディスク上に小さなアセンブリブートローダーを作成することで何度か混乱しましたが、C ++でブートローダーを作成できるかどうか疑問に思っていました。もしそうなら、どこから始めればよいでしょうか。私が知っているすべての人にとって、それが使用するかどうかさえわかりませんint main()
。
助けてくれてありがとう。
フロッピーディスク上に小さなアセンブリブートローダーを作成することで何度か混乱しましたが、C ++でブートローダーを作成できるかどうか疑問に思っていました。もしそうなら、どこから始めればよいでしょうか。私が知っているすべての人にとって、それが使用するかどうかさえわかりませんint main()
。
助けてくれてありがとう。
ブートローダーを作成している場合は、基本的に何もないところから始めています。コードの小さなチャンクがメモリに読み込まれ、実行されます。ブートローダーの大部分はC++で記述できますが、最初に独自のC++ランタイム環境をブートストラップする必要があります。
より高いレベルのものを実行するための適切な環境をセットアップする必要があるため、アセンブリは実際には最初の段階の唯一のオプションです。Cコードを実行するのに十分なことを行うのはかなり簡単です-あなたは以下を必要とします:
次に、適切なポイント(たとえば)でコードにジャンプして、基本的な言語機能が機能するmain()
ことを期待できます。(実装またはリンクされている可能性のある標準ライブラリの機能は、この段階で追加の初期化が必要になる可能性があります。)
C ++に適した環境を実現するには、ここでより多くの初期化が必要であり、ランタイムサポートを必要とするコア言語機能もあるため、より多くの労力が必要です(これもライブラリ機能を検討する前です)。これらには以下が含まれます:
new
とdelete
;これらはC環境が稼働するまで必要ないため、これらを処理するコードは、アセンブラーではなくCで(または上記の機能を使用しないC ++のサブセットでも)記述できます。
(同じ原則が組み込みシステムにも当てはまり、そのようなシステムがC ++を使用することは珍しくありませんが、限られた方法でのみ使用されます。たとえば、ランタイムサポートが実装されていないため、例外やRTTIはありません。)
ブートローダーの作成で遊んでからしばらく経ちましたので、メモリを使い果たします。
x86ブートローダーの場合、x86アセンブリを出力できるC ++コンパイラが必要です。または、少なくとも、CPUを32ビット保護(または64)にする16ビットアセンブリで独自のプリアンブルを作成する必要があります。 -ビット長)モード、C++関数を呼び出す前に。
ただし、これを実行すると、基になるlibcを必要とするものから離れている限り、C++の言語機能のすべてではないにしてもほとんどを利用できるようになります。しかし、CRTなしですべてを静的にリンクすれば、あなたは金なりです。
ブートローダーには、それを呼び出すためのアセンブリコードを記述しない限り、「intmain()」はありません。ステージ1のブートローダーを作成している場合は、それを強くお勧めしません。
それ以外の場合、osdev.orgにはこのトピックに関する優れたドキュメントがあります。
C ++でブートローダーを作成することはおそらく可能ですが、コードをダイナミックライブラリにリンクしないことを忘れないでください。また、C ++であるという理由だけで、STLなどを使用できる/使用する必要があるという意味ではないことを覚えておいてください。
はい、可能です。この質問には、回答の要素と役立つリンクがあります
こちらもご覧ください。C++ブートローダーの例があります。
理解しておくべき主なことは、通常の豪華な実行可能ファイル形式(WindowsではPE、UnixではELF)の代わりにフラットバイナリを作成する必要があるということです。これらのファイル形式では、それらをロードするためにOSが必要であり、ブートローダーではまだOSを持っていません。
静的にリンクする場合は、ライブラリの使用は問題になりません(上記の実行可能ファイルの問題のため、動的リンクはありません)。しかし、明らかにすべてのOSAPI関連のエントリポイントが利用できるわけではありません...