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 だって。