システムメモリサイズの取得(BIOS)


これまでのOSの様子です.32ビット保護モードからIA-32 e(64ビット)モードへの移行を準備します.
メモリサイズを求めるコードが直接アクセスして値を記録する方法だと説明していますが、私はこの方法が好きではありません.cpu-zのようなプログラムでは、メモリがいくつかのスロットに使われていることもわかりますが、この方法はあまりにも一般的だと思います.

バイオス割込み取得


これは最も簡単な方法です.eax=0 xE 820の場合、現在のシステムのメモリマッピングは0 x 15割り込みで取得できます.下図に示すように、Base-Longth-Typeとして格納されます.

使用方法は、EAXに0 xE 820、ECXに24(10進数)、EDXに0 x 534 D 4150、
ES:DIメモリマッピングを格納するアドレスを設定すると、呼び出し0 x 15が中断する.終了基準はEBX=0です.
メモリマッピングはBase-Longth-Typeの24バイトで格納されます.このため、一度コールするとDIも24増加する.
もちろんBIOS割り込みなので、16ビットリアルモードで呼び出す必要があります.以下のコードは、0 x 7 E 00にマッピング数を格納し、0 x 7 E 08からメモリマッピングを格納する.
DETECT_INIT:
    mov ebx, 0 ; ebx 초기화
    mov edx, 0x534D4150	; 매직 넘버
    mov ax , 0x7E0
    mov es, ax
    mov di, 0
    mov byte [es:0], 0 ; 0x7E00 = 맵 개수 
    add di, 0x8 ; 0x7E08 = 맵 시작
DETECT_ENTRY:
    mov eax, 0xE820
    mov ecx, 24
    int 0x15
    add byte [es:0], 1
    cmp ebx, 0
    je DETECT_END
    add di, 24
    jmp DETECT_ENTRY
DETECT_END:
次に保護モードに入り、そのアドレスの値を読めばよい.簡単なC言語コードは以下のコードを記述することができる.
DWORD kGetTotalMemorySize32()
{
    int mapCount = *(int*)(0x7E00); //메모리 맵 개수
    int* mapAddr = (int*)(0x7E08);
    int totalSize = 0;
    for(int i = 0; i< mapCount; i++)
    {
        totalSize += *(mapAddr+2);
        mapAddr += 6;
    }
    return totalSize;
}

Serial Presense Detection


これは、CPU-Z、HWMoitorなどのプログラムで使用される方式です.コンピュータが大きくなると、マザーボードのデバイスが
「私はアクションをしています~」とメッセージを送り、送信したメッセージを利用します.
そうですね.今はまだ分かりません.PCIコンフィギュレーションスペースでアクセスしたようです.後で64ビットのオペレーティングシステムの基礎があって、私は整理して更にアップロードしたいです.
うん...PCIは前回Virtual box One Exploitで少し勉強してよかったですハハ