在此先補點Hardware的基本觀念好了,以前都只做Windows上的Application,有許多底層的硬體基礎要研究...
早期Intel在1978年所推出的16位元8086 CPU有20條位址線,所以可控制的記憶體最大為1048576Bytes = 1MB(220)。
Intel CPU list:
CPU | Data Bus | Address Bus | Max Addressable Memory |
8086/88 | 16 | 20 | 1MB |
80286 | 16 | 24 | 16MB |
80386SX | 16 | 24 | 16MB |
80386DX | 32 | 32 | 4GB |
80486SX/DX | 32 | 32 | 4GB |
Pentium | 64 | 32 | 4GB |
Pentium Pro | 64 | 36 | 64GB |
以下為1MB以下各區段的記憶體配置表。
Memory Map:
0xE0000 - 0xFFFFF | BIOS |
0xC8000 - 0xDFFFF | I/O BIOS |
0xC0000 - 0xC7FFF | Video BIOS |
0xB8000 - 0xBFFFF | VGA Color Mode Text RAM |
0xB0000 - 0xB7FFF | VGA Monochrome Mode Text RAM |
0xA0000 - 0xAFFFF | VGA Graphics Mode RAM |
0x00500 - 0x9FFFF | User Program Space |
0x00400 - 0x004FF | BIOS Data Area |
0x00000 - 0x003FF | Interrupt Vector Table |
傳統記憶體(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的開關,這又是一門學問了...
沒有留言:
張貼留言