- 首先,說下開機後CPU的第一個動作:CS=DS=ES=SS=0xFFFF,IP=0x0000。因爲當前模式是實模式,CS:IP指向的地址實際是0xFFFF0,這個地址存的是個far jump,去跳到BIOS的POST階段(BIOS在FlushROM執行和RAM裏執行的細節還需要了解),其中一個目的就是重置CS寄存器。
- 什麼是32位Big Mode(或稱Flat Mode)?它在什麼情景下會被用到?解決什麼問題的?中間還會牽扯開啓A20
- 80286之前,地址總線是20位的,也就是說最多能尋址2^20次方地址,也就是1M,當然80286增加了地址總線寬度到24位,而這塊又會牽扯到A20。那麼如果本身物理內存超出1M,而我們又在實模式,怎麼辦呢?我們就需要Big Mode。但是Big Mode能夠解決的問題只是對於大內存的訪問問題,對於執行還是限制在1M範圍之內。
- 總體來說,其實是實模式利用了保護模式的段選擇子特性,才擴大了尋址的範圍。
EnterBigMode proc
xor eax, eax
mov eax, cs
shl eax, 4
add eax, GDT_TABLE
mov dword ptr[Gdtr + 2], eax
mov word ptr [Gdtr], 0x18
lgdtr fword ptr [Gdtr]
mov ax, cs
mov word ptr [RM_Segment], ax
call @f
@@:
pop ax
add ax, RM_Offset - ($ - 1)
add ax, 4
mov word ptr [RM_Offset], ax
call @f
@@:
pop ax
add ax, PM_Offset - ($ - 1)
add ax, 4
mov word ptr [PM_Offset], ax
EnableA20
mov eax, cr0
or eax, 0x01
mov cr0, eax
DB 0xEA
PM_Offset: DW 0
PM_Selector: DW 0x10
mov eax, 0x08
mov es, eax
mov ds, eax
mov eax, cr0
and al, 0xFE
mov cr0, eax
DB 0xEA
RM_Offset: DW 0
RM_Segment: DW 0
ret
EnterBigMode Endp
Gdtr:
DW 0
DD 0
GDT_TABLE:
DW 0, 0, 0, 0
DW 0xFFFF, 0, 0x9200, 0x00CF
DW 0xFFFF, 0, 0x9A00, 0x000F
EnableA20 macro
push ax
in al, 0x92
or al, 00000010b
out 0x92, al
pop ax
macro