2011年2月20日 星期日

Real Mode


在此先補點Hardware的基本觀念好了,以前都只做Windows上的Application,有許多底層的硬體基礎要研究...

早期Intel在1978年所推出的16位元8086 CPU有20條位址線,所以可控制的記憶體最大為1048576Bytes = 1MB(220)。

Intel CPU list:
CPUData BusAddress BusMax Addressable Memory
8086/8816201MB
80286162416MB
80386SX162416MB
80386DX32324GB
80486SX/DX32324GB
Pentium64324GB
Pentium Pro643664GB

以下為1MB以下各區段的記憶體配置表。
Memory Map:
0xE0000 - 0xFFFFFBIOS
0xC8000 - 0xDFFFFI/O BIOS
0xC0000 - 0xC7FFFVideo BIOS
0xB8000 - 0xBFFFFVGA Color Mode Text RAM
0xB0000 - 0xB7FFFVGA Monochrome Mode Text RAM
0xA0000 - 0xAFFFFVGA Graphics Mode RAM
0x00500 - 0x9FFFFUser Program Space
0x00400 - 0x004FFBIOS Data Area
0x00000 - 0x003FFInterrupt Vector Table
※其中0xA0000至0xBFFFF為Video RAM

傳統記憶體(Conventional Memory)為640KB以下
延伸記憶體(Extended Memory)為1MB以上
UMB(Upper Memory Block)的範圍為0xA0000至0xFFFFF的位址,大小為384KB

早期CPU的Register只有16bits,所以使用兩個Register來定址,表達方式CS:IP(Code Segment:Instruction Pointer),而一個Segment的長度為64KB
其算法為Address = Segment * 16 + Offset
舉例C800:1234的實際位址為C8000 + 1234 = C9234,只要將CS往左偏移4個bits再加上IP即可。

但由於Address Bus只有20bits,CS:IP最高卻可表達到FFFF:FFFF(10FFEF = 1114095Bytes),超過了1MB界線的話,將會進行為Memory Wrap,如0x10AAAA的位址為0xAAAA。
然而之後的CPU Address Bus都已超過20bits(如80286可定址到16MB的記憶體),若要以用額外的記憶體空間,就必須要將A20 Enable
有些利用Memory Wrap特性的程式可能最後發生問題了,所以遇到該類型程式還是必須將A20 Disable掉。
FFFF:0010(1MB)至FFFF:FFFF這段空間就稱為HMA(High Memory Area)。

關於A20的開關,這又是一門學問了...