小華的部落格: A20 開關 v.s 回繞

搜尋此網誌

網頁

星期四, 12月 20, 2007

A20 開關 v.s 回繞

很多剛入行的朋友問我A20開關的知識,我這邊就整理一下相關資訊,讓大家查閱的時候可以有個參考。

首先先說明相關的CPU的工作模式:在目前x86下面工作模式與A20有關的就是保護模式跟真實模式。

真實模式下,它允許定址到1MB記憶體,所以超過1MB的位址(FFFFFh)要繞回去00000h,這就是所謂的回繞

保護模式下則分不同時間點來談,在80286 時,位址線增加到24 pin,所以可以定址到16M,而為了向下相容,所以設計了一個開關A20 Switch來控制A20~A23,當A20=0時,強制把位址線歸零,當A20=1時,可進位

後來因為這個開關要Reset才能回復狀態,因此出現一個新的問題就是進入保護模式後,要重新開機才能回到真實模式。

於是有人就想說找一個設備,然後控制這個設備就可以做A20的開與關,因此找上了8042 KBC,所以以後開關A20 Switch時,只要去設定8042就可以了,因此解決了每次回真實模式都要重新開機的問題。

後來80386 之後,CPU的設計可以直接從保護模式切換回去真實模式,但是為了向下相容,所以還是一值保留這個設計。

慢慢的這個留下來的設計又出現新的問題,x86設計師可能想說每次都透過8042去開關速度有點慢,因此後來又提出了Fast A20 的設計,簡單說就是透過Port 92h 直接設定A20 switch開關。

至於這個被保留下來的設計,還有沒有當初的功能我也沒去測試,不過已經變成一種習慣,就是進入保護模式要去開關A20 switch。

以上大致上就是x86對於 A20的歷史,有興趣的人可以多去找找ㄧ些資料來看,或是做做小實驗,看看A20 switch不開的時候,會發生什麼事情 ^^.

3 則留言:

Unknown 提到...

您好,小弟我有買了一本跟BIOS相關的書,上面對於A20有著這樣的敘述:
如果以seg=FFFFh,offset從0010h~0fffh來定址,最大能表示的記憶體區域是FFFF:0010~FFFF:FFFFh,記憶體空間超過20條定址線的表示,變成從100000h~10FFEFh(約1088k扣除16個bytes的空間)
以上就是這本書的局部內容,最主要的疑點來自最後一句話100000h~10FFEFh明明不到100k,哪來的1088k?為何又要扣16bytes?是我誤解了什麼嗎?

匿名 提到...

想問一下在BIOS選項Gate A20 Option設定FAST或NORMAL會有什麼差別嗎?以現在的電腦而言看的出來會有什麼變化嗎?
最近再煩惱這個function

謝謝

小華的部落格 提到...

>100000h~10FFEFh
當時的cpu最大定址範圍是到10FFEFh
而多出來的部分你自己計算一下FFEFh=65519 (64k是65535,比64k少了16),所以表示成最大定址範圍為1M+(64k-16),但是你如果把10FFEFh直接換算10進制在除1024的話就會變成1087.xxk 約1088k,不過應該沒有人會這樣算,你那本書名可以說一下嗎? 還真的是很好奇作者是誰?

另外要提的是當時的位址線只有1M,所以就算多出了FFEFh你也沒辦法用,而且他也沒打算讓你用,所以就用回繞技術了!

>BIOS選項Gate A20 Option設定FAST或NORMAL會有什麼差別嗎?

我沒去追過這部分的bios code,而且各家bios做法不同,不過單純依照字面上翻譯應該只是決定Fast 92h Port/KBC二擇一來控制A20,其結果應該是一樣的,只是選擇誰來控制而已!