-2

私が理解しているように、ブートローダーのコアはローダープログラムです。ローダーとは、別のプログラムをロードするプログラムを意味します。または、より具体的には、最初にそれ自体をロードし、次に高レベルのイメージ (カーネルなど) をロードします。ブートローダーを作成する代わりに、別のプログラムをロードする OS 上で実行することで、ローダーに対する疑問を解消しようと考えました。私は、すべてのプロセス マップが別のプロセス マップと完全に独立していることを理解しています。だから、私がやろうとしているのはhello_world.c、素晴らしい "hello world" を出力する簡単なプログラムを作ることです。さて、このプログラム hello world をロードするローダープログラムを作りたいと思います。私が理解しているように、核心は2つのステップにあります

  1. hello world プログラムを RAM - loader アドレスにロードします。
  2. エントリアドレスへのJMP。

これは概念を理解するためのものなので、既製のユーティリティ readelf を使用して、hello world バイナリのアドレスを読み取ります。ここでの意図は、ELF パーサーを作成することではありません。すべてのプロセスが独立しているため、仮想メモリを使用します。仮想メモリアドレスを使用すると、これは失敗します。ここで立ち往生しています。どうすればこれを達成できますか?

#include "stdio.h"
   #include <sys/mman.h>

    int main( int argc, char **argv)
    {
      char *mem_ptr;
      FILE *fp;

      char *val;
      char *exec;

      mem_ptr = (char*) malloc(10*1024);
      fp = fopen("./hello_world.out","rb");

      fread(mem_ptr, 10240, 1, fp);

      //val = mem_ptr + 0x8048300;

      printf("The mem_ptr is %p\r\n",mem_ptr);


    exec = mmap(NULL, 10240, PROT_READ | PROT_WRITE | PROT_EXEC,
                      MAP_PRIVATE | MAP_ANONYMOUS, 0x9c65008, 0);


      memcpy(mem_ptr,exec,10240);


     __asm__("jmp 0x9c65008");

     fclose(fp);


      return 0;
    }
4

1 に答える 1

1

私の担当者は、コメントを追加できるほど十分ではありません。

Chris Stratton が言ったように、あなたの問題はあいまいに聞こえます (編集後も!)。あなたは__したいですか

  1. 実際の OS の代わりに「Hello, World」をロードするブートローダーを作成しますか?<--Actual Problem is saying this OR

  2. OS上で実行されるプログラムを作成し(完全なOSがそこにあるように)、このプログラムを使用して別の実行可能ファイルをロードしますか?<--Comments are saying this

これによって答えは大きく変わってきます。

最初のケースでは、ブートローダーが BIOS に存在し、事前定義されたメモリ ブロックを RAM にフェッチします。だからあなたがする必要があるのは、あなたHello, Worldをこの場所に置くだけです。チェーンのロードなど、これに関しては多くのことがありますが、これがあなたが達成したいことかどうかはわかりません。これがあなたが望んでいたものではない場合、なぜbootstrapタグが使用されるのですか?

2番目のケースでfork() + exec()は、あなたのためにそれを行います。ただし、この方法では、2 つの異なるアドレス空間が存在することを確認してください。それらを同じアドレス空間に入れたいのなら、私は疑わしいdaily used OS(for normal guys). あなたのパートのほとんどは、あなたがやりたいことのように聞こえます。

これとは異なることを聞きたい場合は、質問のほぼ全体を編集して、その部分だけを質問してください。

于 2013-09-26T07:56:53.033 に答える