Int15h E820H Call

ACPIスペックを見ると、デバイステーブルを読むためにはとりあえずメモリマップを 得て、そのメモリマップにしたがってメモリを保護して、おかないとダメっぽい。 それで、FreeBSDのソースをBIOSでgrepして探すと、何だVM86オプションつければ int15h E820Hを呼んでるんじゃん。何とか動くかな?っとあれれ?E820Hが失敗して かわりにE801コールをしてる。なんでだ?.......ACPIスペックを読むと..... これってリアルモードからしか呼べないんだって。このリアルモードって 仮想86モードも含むのかな?APMはリアルモード初期化してたみたいだけど。 これは、VM86オプションつけると仮想86モードで初期化するんだよな。 っつーことは、APMスペックをみればそれらは普通区別されるかどうか わかるわけだよな。ふんふん。APMは明示的に仮想86モードで初期化可能 って書いてあるよな。ということは、ありゃ意味のないコードやん。 ってなわけで最低優先順位をつけてでsend-prしときました。ということは、 リアルモードで初期化するコードをアセンブラで書かなきゃだめってことだよね。 えーん。まあ、あのコード自体は単にRTCテーブルを読む代わりに折角使えるように なったBIOSコールで読んでみようってだけの事だと思うので、 わざわざ苦労してまでint15h E820hコールにこだわる事はないとは思うんですが。 まあ、VM86で呼んでる事を除けばサンプルコード通り書いてあるんだけどね。 でもACPIテーブルを読むには必須だよね。そういやBIOSを検知するコードで これまた変な事やってて、ACPIテーブルはいわゆる互換性メモリ領域にはおかれ る保証はないのに、そこをスキャンして、ROOT ACPIテーブルの RSDTシグネチャを見つけようとしてる。見つけるんだったら、それへのポインタ RSD PTR だって。