作業系統又實模式進入保護模式之前要開啟
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的位址範圍!但...