2011-07-22 108 views
7

當發送命令並從某個芯片讀取數據時,比如說RTC,不同的文檔說我們應該等待一段時間再從設備讀取數據以確保數據可用。很多代碼都會從端口0x80中進行虛擬讀取。我想知道這個地址位置連接了什麼設備,如果有的話。我正在談論IA-32 PC架構。0x80端口地址連接到什麼地方?

+0

在Linux內核4.2上的使用:https://github.com/torvalds/linux/blob/v4.2/arch/x86/boot/boot.h#L78 –

+0

每個端口映射到的內容:http:// stackoverflow .com/questions/14194798/is-there-a-specification-of-x86-io-port-assignment –

回答

12

I/O端口0x80的傳統上用於POST代碼。 (POST =加電自檢)

當系統啓動時,BIOS將輸出一系列的調試代碼到I/O端口0x80的。這些是爲了調試非引導系統而設計的。

在大多數臺式電腦中,您可以安裝POST代碼調試板,該板基本上是一個小型PCI(或ISA)插槽板,可將I/O寫入I/O端口0x80並通過7段顯示值LED指示燈。

PCI Post Code board

通常情況下,通過非常迅速POST代碼閃存。但是,如果您的系統在啓動時掛起,您可以查看最新的POST代碼是什麼,並使用此信息來排除系統故障。

This site包含了大多數BIOS標準的POST代碼列表。但是,計算機/主板製造商可能會插入自己的POST代碼,因此該列表不是100%全面的。

後的系統已開始啓動操作系統,POST代碼不是很相關。但是,有些操作系統供應商可能會使用POST代碼板作爲調試工具,特別是在代碼中printf()可能不實用的地方(例如中斷服務程序)。

一些操作系統將使用的讀取和寫入I/O端口0x80的作爲拖延機制。如果您需要等待幾微秒才能完成某些操作,則使用完整的sleep()或delay()定時器可能不切實際,因此對「安全」I/O地址執行「虛擬」讀/寫操作是輕量級的解決方案。對0x80進行讀寫操作基本上可以保證不會對系統的運行產生不利影響,所以對於這種虛擬操作來說,這是一個不錯的選擇。

你會發現,有許多舊/較慢的外圍設備(如您的RTC芯片),有時需要等待幾微秒的I/O寫操作「生效」。對0x80的虛擬訪問是一種方便的方法。

您也可以找到代碼,不會虛寫0x80到「刷新」任何電器「回聲」的公交車。在某些碼平臺,可以將值寫入到未使用/無效I/O地址,讀取該地址回來了,看你剛剛編寫的值,即使沒有硬件實際上是在該地址。但是,如果你在中間寫入另一個地址(比如I/O端口0x80),你可以防止這種情況發生。

+0

添加到答案:http://www.intel.com/support/motherboards/desktop/sb/CS- 025434.htm – phoxis

+0

@phoxis請注意,您列出的代碼是基於EFI固件的英特爾主板所特有的代碼。該列表可能不適用於其他主板。 –

+0

是的,我的意思是我們可以使用該端口進行虛擬讀取和寫入以引入小的延遲。 – phoxis

2

它應該是一個延遲;例如讀

> The inb_p(), outb_p(), inw_p(), and outw_p() macros work otherwise 
> identically to the ones above, but they do an additional short (about 
> one microsecond) delay after the port access; you can make the delay 
> about four microseconds with #define REALLY_SLOW_IO before you 
> #include <asm/io.h>. These macros normally (unless you #define 
> SLOW_IO_BY_JUMPING, which is probably less accurate) use a port output 
> to port 0x80 for their delay, so you need to give access to port 0x80 
> with ioperm() first (outputs to port 0x80 should not affect any part 
> of the system). For more versatile methods of delaying, read on. 

here

2

enter image description here

您可以通過內核驅動程序使用此代碼寫(讀)至(自)端口0x80的:

(請注意,像我的一些個人電腦在這個位置上有一個詞這樣一個可以寫16位。)

Windows驅動程序示例:
__outword(0x80,0x00A0);

如果您沒有雙機調試系統,並且出於任何原因(例如系統死機)無法使用debugview跟蹤,則也可能用於內核調試。端口80可能會爲您保留上次的調試代碼。