マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

new、deleteを実装しなければ…

今の状態だとnewとdeleteが使えないので実装しなければ!それでOS側ではnewやdeleteが来たらvmcallを呼び出す。ちなみにvmcallはnasmで書かれていて、

vmcall:
    MOV EAX, [ESP + 0x4]
    MOV ECX, [ESP + 0x8]
    MOV EDX, [ESP + 0x0C]
    MOV EBX, [ESP + 0x10]
    INT 0x45
    RET

となっている。引数を汎用レジスタに入れてINT 0x45するだけ。エミュレータ側ではINT 0x45を見つけたらレジスタの値(今のところEAX)を見て、呼び出す機能を決めている。

それでnewやdeleteなのだが、メモリ管理をエミュレータ側に任せても、あまり苦労は変わらないと思うので、エミュレータでもnewを呼び出す。それで、エミュレータではnewで確保されたアドレスの一覧とそれらの確保したサイズを保持しておく。そしてOS側ではnewで取得したアドレスだということを示すために、最上位ビットを1にしておく。これでエミュレータ側でnewで確保されたものかどうかを判断する。Javaエミュレータ作ってるのでdeleteがないのだが、参照切って後はgcに任せておく。とりあえず実装だ