Friday, May 16, 2008

Big Real Mode (大真實模式)

“大真實模式”, 什個跟什麼!! 好好的英文名詞變的這麼好笑 (這是我亂翻的).
一般有興趣寫 OS Kernel 的 Developer, 通常對於如何 Enable 32-bit protected mode 感到興趣.而進入 protected mode 後, 在記憶體管理方面, 又可分為 FLAT 及 Paging.
BIOS 及 DOS 大部分都是 Real Mode 的程式, 其最高可存取的位址為 0 到 FFFFFh, 也就是 1MB.
什麼! 1MB! 我的電腦插的可是 1GB/2GB/4GB, 難道 BIOS 開機時一直跳的數字是 “顯示給使用看爽的” ?
到底 BIOS 是怎麼樣, 在不進入 32-bit protected mode, 卻又可以初始化存取 1MB 以上的記憶體呢?
答案就是……”大真實模式”!!! (請原諒我使用中文:p)
所以要存取 1MB ~ 4GB 的 Memory Space, 32-bit protected mode 並不是唯一的選擇.
但要如何 Enable 呢?
先簡單的描述一下, 改天再附個範例上來.
一般 Enable 32-bit protected mode 會需要先在 16-bit Real Mode 中, 設定兩個 GDT Segment Descriptors(for Code and Data), Privilege Level 0, Base 為 0×00000000, Limit 為 0xFFFFFFFF(4GB).
後將 GDT Pointer 載入 GDT Register, 打開 A20 及 CR0 protected mode bit 後, 需作一個 FAR Jump(同時 load CS 及 EIP) 到 32-bit protected mode 的程式碼.
而進入 32-bit 程式碼後的第一件事, 就是要重新 Load DS, ES, FS, GS 等 Segment Selectors 成為 GDT Segment Descriptors 的 Offset 值後, 即完成了 protected mode switch.
而 Big Real Mode 怎麼打開?
其實很簡單, 但改為FAR Jump 到一樣是 16-bit 的程式碼 (重 Load CS and IP), 設定好 DS, ES, FS, GS 為 GDT Segment Descriptors 的 Offset 值後, 關閉 CR0 內的 protected mode bit, 保持 A20 在開啟狀態, “大真實模式” 就完成了, 接下來 4GB Memory Space 隨你存取.
mov ebx, 0f1230000hmov al, [ebx]
愛怎麼弄就怎麼弄, 隨你高興啦~那怎麼返回 Real Mode 呢? ……對不起, 請重開機……
沒啦, 開玩笑的! 其實只要在 Enable Big Real Mode 之前, 將 DS, ES, FS, GS 的值 push 進入 stack. 使用完畢後 pop 回來, 並 Disable A20 就行啦.
請服用吧!
Note: Big Real Mode 有些地方稱為 Unreal Mode 或 Flat Real Mode. from http://osdevr.olux.org/

0 Comments:

Post a Comment

<< Home