一步步编写操作系统 26 打开A20地址线
打開A20地址線
還記得實模式下的wrap-around嗎?也就是地址回繞。咱們一起來復習一下。實模式下內存訪問是采取“段基址:段內偏移地址”的形式,段基址要乘以16后再加上段內偏移地址。實模式下寄存器都是16位的,如果段基址和段內偏移地址都為16位的最大值,即0xFFFF:0xFFFF,最大地址是0xFFFF0+0xFFFF,即0x10FFEF。由于實模式下的地址線是20位,最大尋址空間是1MB,即0x00000~0xFFFFF。超出1MB內存的部分在邏輯上也是正常的,但物理內存中卻沒有與之對應的部分。為了讓“段基址:段內偏移地址”策略繼續可用,cpu采取的做法是,將超過1MB的部分自動回繞到0地址,繼續從0地址開始映射。相當于把地址對1MB求模。超過1MB多余出來的內存被稱為高端內存區HMA。
這種地址回繞是如何做到的呢?要分兩種情況分別討論啦。
對于只有20位地址線的cpu,不需要任何額外操作便能自動實現地址回繞。
地址(Address)地址線是從0開始編號,在8086/8088中,只有20位地址線,即A0~A19。20位地址線表示的內存是2的20次方,即最大是1MB,即0x0~0xFFFFF。內存若超過1MB,是需要第21條地址線支持的。所以說,若地址進位到1MB以上,如0x100000,由于沒有第21位地址線,相當于丟掉了進位1,變成了0x00000。這一“缺陷”甚至成了當時很多程序員利用的技巧。如圖
?
對于80286后續的CPU,通過A20GATE來控制A20地址線 。
cpu發展到了 80286后,雖然地址總線從原來的20位發展到了24位,從而能夠訪問的內存范圍可達到2的24次方等于16MB。但任何時候,Intel都會把兼容放在第一位。80286是第一款具有保護模式的cpu,它在實模式下時,其表現也應該和8086/8088一模一樣。按照兼容的要求,這意味著80286以及后續cpu的實模式都應該與8086/8088完全一樣,即:仍然只使用20條地址線。但80286有24條地址線,即A0~A23,也就是說A20地址線是開啟的。如果訪問0x100000~0x10FFEF之間的內存,系統將直接訪問這塊物理內存,并不會象8086/8088那樣回繞到0。
為了解決此問題,IBM在鍵盤控制器上的一些輸出線來控制第21根地址線(A20)的有效性,故被稱為A20Gate:
- λ如果A20Gate被打開,當訪問到0x100000~0x10FFEF之間的地址時,cpu將真正訪問這塊物理內存。
- λ如果A20Gate被禁止,當訪問0x100000~0x10FFEF之間的地址時,cpu將采用8086/8088的地址回繞。
上面描述了地址回繞的原理,但地址回繞是為了兼容8086/8088的實模式。如今我們是在保護模式下,我們需要突破第20條地址線(A20)去訪問更大的內存空間。而這一切,只有關閉了地址回繞才能實現。而關閉地址回繞,就是上面所說的打開A20Gate。
說了半天,其實打開A20Gate的方式是極其簡單的,將端口0x92的第1位置1就可以了,以下三個步驟就可以實現啦。
我們離保護模式越來越近了,為了給大家一個盼頭,劇透一下,其實我們距32位地址空間只差一步,下一節中我們將播出有關內容,歡迎大家準時收看^_^
總結
以上是生活随笔為你收集整理的一步步编写操作系统 26 打开A20地址线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php记录登录时间,php记录 用户当前
- 下一篇: 美元正在加速贬值,美国欠的债务就能少还了