9

OSなしでRAMから直接実行できるように、 Cプログラムを有効なELF形式(またはRAW形式)にコンパイルするにはどうすればよいですか? RAM の任意の場所にコードをロードし、そのアドレスで実行を開始できるブートローダーが存在すると仮定します。正確には、コンパイラ( GCC )フラグは何ですか? マップファイルは必要ですか?

サンプルの helloworld アプリケーションは大歓迎です :)

私の要点を詳しく説明するために
、main() メソッドを空の無限 while ループにして、OS固有または標準のライブラリ呼び出しが使用されないようにします。目的の o/p はハングです。通常のGCCオプションを使用すると、ブートローダーは実行可能ファイルのロードに確実に失敗し、無効なELF形式であることが通知されます。ただし、リンカーに-dNオプションを渡すと、有効なELFになります。クラッシュせずにハングアップさせるには、より多くのコンパイラ/リンカーオプションが必要です!! これらのコンパイラ オプションとは正確には何ですか?

file.c:
int main()
{
    while(1);
}

コンパイル
gcc -c -nostdinc -fno-builtin
file.c ld -dN -nostdlib file.o

ブートローダーはa.outを RAM にロードして実行します。

4

4 に答える 4

6

まず、ブートローダーが作業を終了すると、できることには制限があります。これらの制限は、次の理由によるものです: (ブートローダー (例: grub) が 32 ビット保護モードに移行すると仮定します) 1. ページングが有効になっていません。有効にする必要があります。2. IRQ のハンドラーを設定する必要があるため、デバイスと対話することはできません。

これは、ベアメタルを介したプログラミングの技術を学ぶために使用した古典的なリンクです ( http://geezer.osdevbrasil.net/osd/index.htm )。また、ページにはダウンロード リンクがあります ( http://geezer.osdevbrasil.net/osd/code/osd.tgz )。tar ファイルには、複雑さが増していくデモ カーネルが含まれています。また、make ファイル (linux.mak) を調べて、gcc に必要なフラグを取得することもできます。

ランダムな make ファイルを開くと、次のフラグが使用されていることがわかりました: gcc : -nostdinc -fno-builtin ld: -nostdlib
(リンカへの明示的な呼び出しが行われるため、ld にもフラグが必要です)。

フラグの目的は、標準ライブラリとのリンクを行ってはならないことを gcc に伝えることです。

于 2009-04-03T13:46:59.293 に答える
0

OSをロードしない場合は、任意のデバイスで動作するようにデバイスドライバーを作成する必要があることをご存知ですか。つまり、その特定のビデオカードのドライバを書き込まずに画面に書き込んだり、その特定のハードドライブコントローラカードのドライバを書き込まずにディスクから読み取ったり、キーボードにアクセスしたりすることはできません。

代わりに、キオスクモードと呼ばれるものを調べることをお勧めします。基本的な考え方は、OSが実行され、アプリに必要なすべてのものが読み込まれ、アプリが読み込まれると、別のアプリに切り替えることができないということです。

于 2009-04-03T15:03:32.323 に答える