Big Mode

  1. 首先,說下開機後CPU的第一個動作:CS=DS=ES=SS=0xFFFF,IP=0x0000。因爲當前模式是實模式,CS:IP指向的地址實際是0xFFFF0,這個地址存的是個far jump,去跳到BIOS的POST階段(BIOS在FlushROM執行和RAM裏執行的細節還需要了解),其中一個目的就是重置CS寄存器。
  2. 什麼是32位Big Mode(或稱Flat Mode)?它在什麼情景下會被用到?解決什麼問題的?中間還會牽扯開啓A20
  3. 80286之前,地址總線是20位的,也就是說最多能尋址2^20次方地址,也就是1M,當然80286增加了地址總線寬度到24位,而這塊又會牽扯到A20。那麼如果本身物理內存超出1M,而我們又在實模式,怎麼辦呢?我們就需要Big Mode。但是Big Mode能夠解決的問題只是對於大內存的訪問問題,對於執行還是限制在1M範圍之內。
  4. 總體來說,其實是實模式利用了保護模式的段選擇子特性,才擴大了尋址的範圍。

模式比較


    EnterBigMode proc
    ; construct gdtr
     xor eax, eax
     mov eax, cs
     shl eax, 4
     add eax, GDT_TABLE
     mov dword ptr[Gdtr + 2], eax
     mov word ptr [Gdtr], 0x18

     ;load gdtr
     lgdtr fword ptr [Gdtr]

     ;set rm jump
     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

     ;set pm jump
     call @f
     @@:
     pop ax
     add ax, PM_Offset - ($ - 1)
     add ax, 4
     mov word ptr [PM_Offset], ax

     EnableA20

     ;enable pm
     mov eax, cr0
     or eax, 0x01
     mov cr0, eax

     ; far jump to pm
     DB 0xEA
     PM_Offset:   DW 0
     PM_Selector: DW 0x10

     mov eax, 0x08
     mov es, eax
     mov ds, eax

     ;disable pm
     mov eax, cr0
     and al, 0xFE
     mov cr0, eax

     ; far jump to rm
     DB 0xEA
     RM_Offset:    DW 0
     RM_Segment:   DW 0

     ret
    EnterBigMode Endp

    Gdtr:
     DW 0     ; Limit
     DD 0     ; Base

    GDT_TABLE:
     DW      0, 0,      0,      0   ; 0x00  :0
     DW 0xFFFF, 0, 0x9200, 0x00CF   ; 0x08  :DS
     DW 0xFFFF, 0, 0x9A00, 0x000F   ; 0x10  :CS

    EnableA20 macro
     push ax
     in al, 0x92
     or al, 00000010b
     out 0x92, al
     pop ax
    macro
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章