Real Mode 與 Protect Mode 的定址

real mode 中定址是以 segment address 左移 4 bits + offset address (16 bits) 來決定
以 DS:SI=F123:0155 來說,就是 F1230 + 0155 = F1385
real mode 中最大定址為 FFFFFH,就是 1MB

而在 protect mode 中,最大定址為 4GB,它是透過 GDT 來做 reference
protect mode 中的 segment address 變為 segment selector
而 offset address 變為 32 bits 的版本
以 DS:ESI=0008:000F1385 來說,0008H 指的是在 GDT 中的 offset 值
參考到 GDT offset = 0008H 這一個 segment descriptor
segment descriptor 中會描寫 segment base address
實際定址到的位址就是這個 base address + ESI (000F1385H)

x86 processor 中有個 big real mode
一般在 real mode 中,code segment 及 data segment 都是 16 bits
而 protect mode 中,code segment 及 data segment 都是 32 bits
但在 big real mode 中,code segment 保持 16 bits,而 data segment 為 32 bits
這個好處是假如我們有個 dos 程式是使用 16 bits 的呼叫,但需要存取超過 1MB 記憶體資料時,就可以使用

要切換到 big real mode 時會使用到 A20
8086 有 20 根位址線,80286 有 24 根,80386 以上有 32 根
A20 關閉時,定址超過 1MB 的位址,將會做回繞動作
A20 開啟時,不會做回繞動作
如:10FFEFH 事實上在 A20 關閉時,是定址到 FFEFH
但 A20 開啟時就是直接定址到 10FFEFH

由在 real mode 時,FFFF:000F = FFFFFH 就是定址到最大的 1MB
這情況下 offset address 大於 000FH 都會被回繞
因此在 A20 被開啟的情況下,只有增加了 FFF0H 的位址 (65520 bytes ~ 64KB)

有個很好的文件可以參考:Introduction to Big Real Mode


留言

熱門文章