關於A20位址線

2021-05-22 05:47:06 字數 4213 閱讀 2835

作業系統又實模式進入保護模式之前要開啟

a20位址線。

那麼什麼是

a20

在8086

、8088

中,有20

跟位址線。所以定址範圍是

2^20 = 1m

,但8086/8088是16

位的位址模式,即只能表示

ffffh

(64k

)的範圍。為了能訪問

1m的記憶體採取了分段的模式。 16

位段基址:

16位偏移。

0xffff:0xffff

達到了0x10ffef 但是

8086/8088

的記憶體不可能超過

1mb,所以當時的程式超過

1mb時會自動回卷。

但是到了

80286

位址線達到

24跟。而

386達到

32根。晶元也達到

32-bit

。定址能力達到

4gb。但是為了向後相容

ibm採用了乙個控制方法。用鍵盤控制器上的乙個剩餘的控制線來控制(注意是鍵盤控制器上的控制線,而不是位址線的第

20跟)。即

a20控制線。當

a20控制線開啟時可以使用

20-31

的位址線。而當

a20關閉時

20-31

的位址線全部為

0.所以,如果

a20被禁止,可訪問的記憶體只能是奇數段(

2n+1)m

,只有當

a20被開啟的時候才能訪問連續的記憶體。 只有

a20開啟才能進入保護模式。

下面討論一下如何開啟

a20從理論上講,開啟

a20 gate

的方法是通過設定

8042

晶元輸出埠(

64h)的

2nd-bit

,但事實上,當你向

8042

晶元輸出埠進行寫操作的時候,在鍵盤緩衝區中,或許還有別的資料尚未處理,因此你必須首先處理這些資料。

所以,啟用

a201.關閉中

斷;2.等待

8042 input buffer為空;

3.傳送禁止鍵盤

操作命令;

4.等待

8042 input buffer為空;

5.傳送讀

取8042 output port

命令;6.

等待8042 output buffer有數

據;7.讀取

8042 output buffer,並

儲存得到的位元組;

8.等待

8042 input buffer為空;

9.傳送write 8042 output port

命令到8042 input buffer

;10.

等待8042 input buffer為空;

11.將從

8042 output port

得到的位元組的第

2位置1(或

清0),然後寫入

8042 input buffer

;12.

等待,直到

8042 input buffer為空

為止;13.發

送允許鍵盤

操作命令到

8042 input buffer

;14. 開啟

中斷。

下面是完成打

開a20 gate的**

: a20enable:

cli                     ;1.關閉中

斷call waitinbufempty    ;2.

等待8042 input buffer為空;

mov al, 0adh

mov dx, 64h

out dx, al              ;3.

傳送禁止

鍵盤操作命令

call waitinbufempty    ;4.

等待8042 input buffer為空;

mov al, 0d0h

mov dx, 64h

out dx, al              ;5.傳送

讀取8042 output port

命令;call waitoutbuffull     ;6.

等待8042 output buffer有數

據;mov dx, 60h

in al, dx               ;7.讀取

8042 output buffer

push ax                 ;儲存讀

取的資料call waitinbufempty     ;8.

等待8042 input buffer為空;

mov al, 0d1h

mov dx, 64h

out dx, al              ;9.傳送

寫8042 output port

命令call waitinbufempty     ;10.

等待8042 input buffer為空

pop ax

or al, 02h              ;11.

將從8042 output port

得到的位元組的

bit 1置1

mov dx, 60h

out dx, al              ;寫入

output port

call waitinbufempty    ;12.

等待8042 input buffer為空

mov al, 0aeh

mov dx, 64h

out dx, al              ;13.傳送允

許鍵盤操作命令

sti                     ;開中

斷ret

waitinbufempty:

mov dx, 64h

in al, dx               ;讀取

status register

test al, 02h

jnz waitinbufempty

ret

waitoutbuffull:

mov dx, 64h

in al, dx

test al, 01             ;讀取

status register

jz waitoutbuffull

ret

後來,由於感覺使用

8042

控制a20

執行太慢了(確實,那麼長的**,中間還要若干次的

wait

),所以後來又出現了所謂的

fast a20

,實際上,現在的大多數機器都是

fast a20

,fast a20

使用92h

埠控制

a20,同時

bios

裡提供了乙個軟中斷來控制

a20:

入口:ah=24h

al=0   

關閉a20

1   

開啟a20

2   

讀取a20狀態

int 15h

返回:如果

bios

支援此功能,

cf=0

,否則cf=1

cf=0

時,ax

返回當前

a20狀態,

1=開啟,

0=關閉 像

8042

中的output port

中的定義一樣,

92h埠的

bit 1

控制著a20,為1

時開啟,為

0時關閉,從

92h中讀乙個

byte

可以看a20

的當前狀態,所以對

92h的操作如下: 讀

a20狀態

mov dx, 92h

in al, dx 如果

al的bit 1為1

表示a20

開啟,否則為0

開啟a20

mov dx, 92h

mov al, 02

out dx, al 關閉

a20

mov dx, 92h

mov al, 0

out dx, al

Linux0 11核心 A20位址線

1981 年 8 月,ibm 公司最初推出的個人計算機 ibm pc 使用的 cpu 是 intel 8088。在該微機中位址 線只有 20 根 a0 a19 在當時記憶體 ram 只有幾百 kb 或不到 1mb 時,20 根位址線已足夠用來定址 這些記憶體。其所能定址的最高位址是 0xffff 0...

保護模式的 A20位址線問題

a20位址線問題 1981年8月,ibm公司最初推出的個人計算機ibm pc使用的cpu是intel 8088。在該微機中位址線只有20根 a0 a19 在當時記憶體ram只有幾百kb或不到1mb時,20根位址線已足夠用來定址這些記憶體。其所能定址的最高位址是0xffff 0xffff,也即0x10...

PC定址方式遺留問題 A20位址線

在8086 8088cpu上,總共有20根位址線,可以定址1m記憶體空間。但是8086的定址方式卻事實上可以訪問到1m 64k的位址空間。想象一下,當段暫存器的值為fff0h,而斷內偏移為1000h的時候,通過段位址 16 偏移位址計算出來的實體地址是100f00h,而這已經超過了1m的位址範圍!但...