2016-02-16 70 views
0

我在回顧I/O的基本知識,雖然我認爲我理解了大部分情況,但我仍然對如何將物理地址或單獨端口映射到單個設備感到困惑。計算機是否在系統啓動時輪詢總線,逐個分配地址給設備,還是有固定的地址加載到內存中?如果這是通過BIOS完成的,該內存佈局信息如何傳遞給操作系統?I/O內存映射

感謝您的幫助!

回答

0

(這個問題已經被問和回答之前,應先搜索)

取決於平臺上,你沒有具體的

一些系統,在這些系統的一些外圍設備,由芯片進行硬編碼/系統設計師。

對於pci(e),如您所定義的那樣,您列舉了搜索連接的外設的總線,並且那些外設配置空間(由外設供應商根據其需要定義)表示多少以及多大他們需要。對於x86電腦,bios不是操作系統而是枚舉。對於其他平臺,它依賴於該平臺,它可能是引導加載程序或操作系統。但是有人必須佔用可用空間(基本上對於知道該平臺的平臺以及已經使用的平臺實質上進行了硬編碼)並將其分開。對於x86來說,它曾經只是一個在32位時間內分開的演出,並且仍然發生在某些系統上,但對於64位系統,bioses可以每秒打開2gig,並且可以將它放置在高地址空間爲了避免內存(不知道爲什麼你的32位系統只有4gig的dram只有3gig可用?)。自然地,平坦的存儲空間只是一種幻想,由pci外設要求的窗口可以是小窗口,例如,帶有大量內存的視頻卡。你使用csrs來移動窗口,就好像站在你的房子裏看着一扇小窗戶,一邊身體移動一邊看着窗外的東西,但只有窗戶的大小。

同樣適用於usb,列舉,公交搜索和外設應答。與USB雖然它不映射到主機的地址空間。

操作系統如何發現此信息嚴重依賴於系統的類型。與BIOS在BIOS上有一種已知的方式來獲取該信息,我認爲你也可以在DOS中得到相同的信息(是的,DOS仍然被大量使用)。對於非pcie或usb,操作系統驅動程序必須找到外設或只知道平臺是否一致(PC中串行端口的地址)或者有方法找到它們而不會損害其他設備或崩潰。有操作系統本身進行枚舉的情況。或者是引導程序,如果這是枚舉發生的地方。但是在各種平臺之上的引導加載程序和操作系統的每個組合可能都有自己的不同解決方案,沒有理由期望它們是相同的。

好的,你確實說過BIOS,並有一個BIOS標籤,暗示着x86系統。 bios會在啓動時執行pci/pcie枚舉,如果你沒有設置你的BIOS來知道你的操作系統是64位的,它可能需要從你的較低4Gig空間中爲pcie設備進行轉換(如果你設置爲64位,但是安裝一個32位操作系統,那麼你出於其他原因出現問題)。我不記得,但是會認爲操作系統可以使用bios調用bios來查找bios做了什麼,應該不難找到這些信息。任何以這種方式不可發現的東西都可能是傳統和硬編碼的,或者使用遺留技術來發現(例如,在一系列地址中的總線風格搜索bios)等。 pcie/usb供應商和產品ID信息告訴驅動程序那裏有什麼,並且它們已經對這些空間進行了硬編碼偏移,以完成與外設進行通信所需的地址。