ELF形式のファイル読み込みと実行に成功しますた
はい、タイトル通り成功しますたよ。
とは言っても、まだ完全な対応ではありません。
スタティックな変数のための領域に関しては未実装だからです。
とは言ってもプログラムヘッダーを見れば大体分かるわけで、すぐに実装できます。
とりあえず必要性が出てくるまで置いておこうと思いますが。
画像中で動いているのはベタバイナリなので、意味合いが違います。
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){ } }