とりあえずの準備

とりあえずユーザタスク用に確保したメモリに
FAT12からファイルを読み出し実行できる事を確認するために、
ELFではなく、そのままのバイナリで実行できるプログラムを作成し、
実際に実行して、その動作を確かめてみた。


やはりFAT12を解析できる事はとても楽で、ファイルのパスを指定するだけで、
ファイルを読み込めるから、非常に良い。


さてここで新たな問題が発生した。
ユーザタスクはユーザタスク用のセグメントに配置することにしている。
さてユーザタスクプログラムが実行中に割り込みが発生した場合、
セグメントが変わるのであるが、gccには割り込みハンドラであるという指定が出来ず、
つまり本来iretを使用すべきなのに、強制的にretになってしまう。
retではCSセグメントの値を戻してくれない。iretで戻してくれる。

そこで割り込みハンドラの一番下にこう書いた。
asm("iret");

そしてbochsで実行し、逆アセして、状況を見ると酷いことになっていた。

(プログラムがごにょごにょ)
iret
add esp, 0x40
pop esi
pop edi
ret

なんじゃこりゃ〜〜〜!!!
返すものを返してからiretでしょうがぁぁぁ!!
お前は借りたものは俺のものって精神かぁぁぁぁ!!!


OSを作成するために製作されたgccなのに、なぜこの問題が解決できんのだ。
いや、別にアセンブリでハンドラを書きますけど、どうしても納得がいかん。


だれかオプションとか知っていたら、コメントによろしく願いたいです。
う〜む、Linuxのソースでも見てみるかなぁぁ。
面倒だからとりあえず放置でいいや