IBM PC 的鍵盤控制器有一個通常稱為 Enable A20 Line 的功能,和記憶體位址有關。但是鍵盤怎麼會和記憶體扯上關係?
IBM PC 最初使用的 Intel 8086 和 8088 ,有 20 條定址訊號線(Address Lines),所以可以定址到 1MByes 的空間。前面 640KB 對應到記憶體,後面 384KB 保留給 BIOS 和界面卡使用。這也就是 DOS 640KB 限制的由來。
808x 使用 Segment:Offset ,Segment shift 4 bits 的定址方式,來存取記憶體。例如 0100:2345 存取到記憶體 0x3345 的位置。於是一個 Segment 最大就是 0xffff, 也就是 64KB。這是早期程式寫作時陣列 64KB 限制的由來。
使用 Segment + Offset 的巧處在於它會 overflow。將 Segment selector 設為 0xffff, 理論上可以定址到最大 1MB+64KB-16bytes 的範圍。但是因為 808x 只有20條定址線,所以實際上存取到的記憶體是繞回最前面 64KB。有些程式利用這個方式,來存取最前面 64KB。
Intel 推出 80286 時,將位址線擴增到 24 條,可定址空間增加到 16 MB。但是上述的範例方式會定址到 1MB 後面的真實記憶體,而不是繞回去。而有許多程式用了這個技巧,一但定址空間增加了,反而不能正常運作。所以 IBM 需要有一個方式來找回舊的行為,保持向前相容。而又要能夠在需要時,切換回去使用 80286 的新功能。
IBM 選擇的方式是在 A20 ,也就是第21條位址線上增加一個 AND 邏輯閘,控制 CPU 送出的值要不要送到板子的其他的地方。如果 AND 的其中一個控制用的輸入是 0,不管 A20 是 0 或 1, 經過之後送到板子上的永遠為 0,而能用同樣的程式存取前面 64KB。
這個控制用的訊號要從哪邊來呢? IBM 「利用」了還有多餘接腳沒用到的鍵盤控制器,Intel 8042。送出一個特殊的命令給 8042,以控制這個輸出給 AND gate 的訊號。也就是說,8042 除了原本應該負責的鍵盤訊號處理,還多作了一個不屬於鍵盤控制器該作的事。
reference:
A20 - a pain from the past
A20 line From Wikipedia
The PS/2 Keyboard Interface 有 8042 的接腳參考
8042 Keyboard Controller (From IBM Technical Reference Manual)
沒有留言:
張貼留言