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