ELF形式のファイル読み込みと実行に成功しますた

itaku2006-04-30


はい、タイトル通り成功しますたよ。
とは言っても、まだ完全な対応ではありません。
スタティックな変数のための領域に関しては未実装だからです。
とは言ってもプログラムヘッダーを見れば大体分かるわけで、すぐに実装できます。
とりあえず必要性が出てくるまで置いておこうと思いますが。


画像中で動いているのはベタバイナリなので、意味合いが違います。
ELF形式が動くということは、いちいちバイナリに変換する必要性がありませんから。
まぁあまり意味が無いと言えば意味がないのかも知れませんねぇ。


でも凄く嬉しいです。
とりあえずapp.elfとapp2.elfを読み込んでTSSで相互にやりとり。
これは画像中、つまりELF関係なしに出来ていたんだけど、
正直凄く嬉しいな。


ちなみに今現在のカーネルのメイン関数を晒してみる。
メインはたったこれだけです。まぁその他の関数が膨大にあるわけです。
今のところ書いたソースはアセンブリ含めて3000行ってところかなぁ。
1万行はまだまだ先ですなぁ。


ちなみにこの前の書きましたが、asm("")の中では、
セグメント間ジャンプ(セグメントをまたいだジャンプ)をするための命令を
機械語そのまま書いているわけです。


実はセグメント間ジャンプを行う命令がC言語には無く、
実際にはアセンブリ言語で書くべきですが、
今はテストと言う事で機械語そのまま書いているわけです。
farジャンプと言いますが、
いつまでも機械語では書かず、当然そのうち実装しますよ。

void os_main(){

	char *string = "Hello. This is a VIP OS.\n";
	unsigned char *dst[64];

	InitGDT();
	Cls();
	print(string);

	DisableInterrupt();
	InitPIC();
	InitIDT();
	EnableInterrupt();

	SetTSS( (TSS*)0x600000, 0x30, 0x38, (unsigned char*)0x000000, 0x200, 0xffff,0x40, 0, 0x18);
	SetGDT(0x100, 0x600000, sizeof(TSS), ( 0x80 | SObject | DPL0 | TSS32bit));
	SetTSS( (TSS*)0x600200, 0x48, 0x50, (unsigned char*)0x000000, 0x200, 0xffff,0x58, 0, 0x18);
	SetGDT(0x108, 0x600200, sizeof(TSS), ( 0x80 | SObject | DPL0 | TSS32bit));

	//テストタスクの読み込みとジャンプ
	strcpy(dst, "/app.elf");
	ELFRead(dst, (unsigned char*)0x400000);
	strcpy(dst, "/app2.elf");
	ELFRead(dst, (unsigned char*)0x800000);

	asm(".byte 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01");

	while(1){
	}

}