絶対アドレスの000000h番地と100000h番地を比較して、同じ値だったら0(GateA20 off)を、違う値であったら1(GateA20 on)を返します。
なぜ000000h番地と100000h番地を比較するのかは、この辺に書いておきました。
絶対アドレスの000000h番地と100000h番地を比較して、同じ値だったら0(GateA20 off)を、違う値であったら1(GateA20 on)を返します。
なぜ000000h番地と100000h番地を比較するのかは、この辺に書いておきました。
BIOSのINT 15H callを使い、システムメモリマップを取得します。
入力 | |
---|---|
レジスタ | 内容 |
AX | E820h |
EBX | 取得するメモリマップのオフセット? |
ECX | メモリマップ情報を返すエリアのレングス (20byte以上) |
EDX | 534D4150h ('SMAP') |
ES:DI | メモリマップ情報を返すエリアのアドレス |
出力 | |
---|---|
レジスタ | 内容 |
CF | 正常:CF clear 異常:CF set(AHにエラーコードが入る) |
EAX | 534D4150h ('SMAP') |
EBX | 次に取得するメモリマップのオフセット(00000000hならば取得完了) |
ECX | 実際のメモリマップ情報のレングス |
ES:DI | メモリマップ情報を返すエリアのアドレス |
ES:DIで指定したエリアに入るマップ情報 | |
---|---|
offset | 内容 |
00h | base address |
08h | レングス(byte) |
10h |
メモリマップタイプ
タイプ 内容 01h memory, available to OS 02h reserved, not available (system ROM, memory-mapped等) 03h ACPI Reclaim Memory 04h ACPI NVS Memory |
メモリマップ情報の取得はEBXレジスタが0になるまで、複数回に分けて取得する必要があります。取得した情報は変数mpに複数個セットされます。
マップの取得が出来なかった場合は、NULLが返ります。
BIOSのINT 15H callを使い、Extended Memoryサイズを取得します。
入力 | |
---|---|
レジスタ | 内容 |
AX | 8800h |
出力 | |
---|---|
レジスタ | 内容 |
CF | 正常:CF clear 異常:CF set(AHにエラーコードが入る) |
AX | 絶対アドレス100000Hから連続したメモリのKbyte数 |
検出した容量は、Mbyteに丸められて変数mpにセットされます。検出出来なかった場合はNULLを返します。
BIOSのINT 12H callを使い、Conventional Memoryサイズを取得します。
入力 | |
---|---|
入力パラメータは無 |
出力 | |
---|---|
レジスタ | 内容 |
AX | 絶対アドレス0000Hから連続したメモリのKbyte数 |
上記で走査したアドレスがR/W可ならば(ret=0)、その下位バイトも走査します。やっていることは、上記の処理と一緒なので割愛。
メモリが有効ならばzero、無効ならばnon zeroを返します。
Extended Memoryを絶対アドレスの1Mbyte目から512*1024Mbyte目までを4Mbyte単位でaddrprobe関数をcallして走査します。
走査して有効なExtended Memoryがあった場合は、変数mpにその容量をセットします。
memprobeのメッセージを画面に表示します。
Using drive 0 , partition 4 .
Loading........
probing:pc0 com1 com2 apm pci mem[
分かりにくいのでロジックを書いておこうかな。
if(システムメモリマップ情報(bios_E820)を取得失敗){ Conventional Memory情報(bios_int12)を取得 if(Extended Memory情報(bios_8800)を取得失敗){ Extended Memoryを走査(badprobe)して情報を取得 } }
検出された、各メモリの情報は配列bios_memmapに格納されます。メモリ情報の終端には識別子としてpm->type = BIOS_MAP_ENDがセットされます。
配列bios_memmapに格納された、メモリ情報を元にメモリ量を表示します。
reading boot ....
Probing:pc0 com1 com2 apm pci mem[639K 253M
そして、I/O Memory holeの領域を除いた、Conventional Memoryサイズを変数cnvmemに、Extended Memoryサイズを変数extmemにセットします。
gateA20on関数で、有効にしたgateA20が正しく動作しているかをcheckA20関数をcallしてチェックします。
そしてチェックの結果を画面に表示します。
reading boot ....
Probing:pc0 com1 com2 apm pci mem[639K 253M a20=on]