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