1. 程式人生 > >I/O埠與記憶體地址

I/O埠與記憶體地址

外設都是通過讀寫裝置上的暫存器來進行的,外設暫存器也稱為"I/O埠",而IO埠有兩種編址方式:獨立編址和統一 編制。而具體採用哪一種則取決於CPU的體系結構。

獨立編址:"I/O對映方式"

記憶體和外設分開獨立編址(它們的地址原則上可以有重合區域);因為獨立,所以記憶體編址可以從0~N,外設編址也可以從0~N; 這就是所謂的"I/O對映方式"(I/O-mapped),也就是“獨立編址”。 而X86等則採用獨立編址.

統一編址:  記憶體對映方式"(Memory-mapped)

就是記憶體和外設的編址放到一起來規劃,被外設用了的地址就不能給記憶體了,反之亦然! 比如:給外設分配地址0~N,那麼記憶體就不能使用0~N了,只能使用N~M!

這就是所 謂的"記憶體對映方式"(Memory-mapped)。優點是CPU就可以像訪問一個記憶體單元那樣訪問外設I/O埠(理解為I/O暫存器),而不需要設立專門的外設I/O指令。

 針對PCI裝置的訪問,獨立編址和統一編址的的區別在於:獨立編址訪問外設有專門的I/O指令(比如:x86的in/out等指令),而統一編址對外設的訪問和都記憶體的訪問指令可以是一樣的(這樣使用起來更方便)!

在不同的系統中,I/O埠的地址編排有兩種形式:儲存器統一編址和I/O獨立編址。 儲存器統一編址(儲存器映像編址):在這種編址方式中,I/O埠和記憶體單元統一編址,即把I/O埠當作記憶體單元對待,從整個記憶體空間中劃出一個子空間給I/O埠,每一個I/O埠分配一個地址碼,用訪問儲存器的指令對I/O埠進行操作。

 儲存器統一編址的優點是:I/O埠的數目幾乎不受限制;訪問記憶體指令均適用於I/O埠,對I/O埠的資料處理能力強;cpu無需產生區別訪問記憶體操作和I/O操作的控制訊號,從而可減少引腳。

儲存器統一編址缺點是:程式中I/O操作不清晰,難以區分程式中的I/O操作和儲存器操作;I/O端口占用了一部分記憶體空間;I/O埠地址譯碼電路較複雜(因為記憶體的地址位數較多)。I/O獨立編址:I/O埠編址和儲存器的編址相互獨立,即I/O埠地址空間和儲存器地址空間分開設定,互不影響。採用這種編址方式,對I/O埠的操作使用輸入/輸出指令(I/O指令)。I/O獨立編址的優點是:不佔用記憶體空間;使用I/O指令,程式清晰,很容易看出是I/O操作還是儲存器操作;譯碼電路比較簡單(因為I/0埠的地址空間一般較小,所用地址線也就較少)。

I/O獨立編址缺點是:只能用專門的I/O指令,訪問埠的方法不如訪問儲存器的方法多。編址總概:上面兩種編址方式各有優點和缺點,究竟採用哪一種取決於系統的總體設計。在一個系統中也可以同時使用兩種方式,前提是首先要支援I/O獨立編址。如:Intel的x86微處理器支援I/O獨立編址,因為它們的指令系統中都有I/O指令,並設定了可以區分I/O訪問和儲存器訪問的控制訊號引腳。而一些微處理器或微控制器,為了減少引腳,從而減少晶片佔用面積,不支援I/O獨立編址,只能採用儲存器統一編址。編址的方法分為統一編址與獨立編址: 統一編址的原理是將IO的埠地址儲存器定址的地址空間範圍之內,此方法也成為儲存器映像編址。CPU訪問一個埠的操作與訪問記憶體的操作相同,也使用訪問記憶體的指令。獨立編址是為埠地址單獨開闢一部分地址空間,其訪問指令也需要使用單獨的指令(不同於記憶體訪問指令)。

例如:CGA顯示卡的記憶體地址直接編入記憶體地址空間範圍,0xB800-0xBC00範圍內,想在顯示器上輸出一個字元,可以直接使用記憶體操作指令進行操作。採用獨立的IO地址空間對控制裝置中的暫存器進行定址與訪問。使用ISA匯流排結構的傳統PC機其IO地址範圍是0x000-0x3ff,共1024個。普通Linux下檢視/proc/ioports檔案可得到相關控制器或設定使用的IO地址範圍。計算機控制系統中,儲存器和I/O介面都接到CPU的同一資料匯流排上。當CPU與儲存器和I/O介面進行資料交換時,就涉及到CPU與哪一個I/O介面晶片的哪一個埠聯絡,還是從儲存器的哪一個單元聯絡的地址選擇問題,即定址問題。這涉及I/O介面的編址方式,通常有兩種編址方式,一種是I/O介面與儲存器統一編址,另一種是I/O介面獨立編址。

一、I/O介面獨立編址方式這種編址方式是將儲存器地址空間和I/O介面地址空間分開設定,互不影響。設有專門的輸入指令(IN)和輸出指令(OUT)來完成I/O操作,例如Z80微處理器的I/O介面是按獨立編址方式的,它利用MREQ和IORQ訊號來區分是訪問儲存器地址空間還是I/O介面地址空間,利用讀、寫操作訊號、區分是讀操作還是寫操作。儲存器的地址譯碼使用16位地址(A0~A15),可以定址64KB的記憶體空間,而I/O介面的地址譯碼僅使用地址匯流排的低8位(A0~A7),可以定址256個I/O埠地址空間。8086微處理器的I/O介面也是屬於獨立編址方式的。它允許有64K個8位的I/O埠,兩個編號相鄰的8位埠可以組合成一個16位埠。指令系統中既有訪問8位埠的輸入輸出指令,也有訪問16位埠的輸入輸出指令。8086輸入輸出指令可以分為兩大類:一類是直接的輸入輸出指令,(如INAL,55H;OUT70H,AX),另一類是間接的輸入輸出指令(如INAX,DX;OUTDX,AL),在執行間接輸入輸出指令前,必須在DX暫存器中先設定好訪問埠號。

二、I/O介面與儲存器統一編址方式這種編址方式不區分儲存器地址空間和I/O介面地址空間,把所有的I/O介面的埠都當作是儲存器的一個單元對待,每個介面晶片都安排一個或幾個與儲存器統一編號的地址號。也不設專門的輸入/輸出指令,所有傳送和訪問儲存器的指令都可用來對I/O介面操作。M6800和6502微處理器以及Intel51系列的51、96系列微控制器就是採用I/O介面與儲存器統一編址的。

兩種編址方式有各自的優缺點,獨立編址方式的主要優點是記憶體地址空間與I/O介面地址空間分開,互不影響,譯碼電路較簡單,並設有專門的I/O指令,所程式設計序易於區分,且執行時間短,快速性好。其缺點是隻用I/O指令訪問I/O埠,功能有限且要採用專用I/O週期和專用的I/O控制線,使微處理器複雜化。統一編址方式的主要優點是訪問記憶體的指令都可用於I/O操作,資料處理功能強;同時I/O介面可與儲存器部分公用譯碼和控制電路。

其缺點是:I/O介面要佔用儲存器地址空間的一部分;因不用專門的I/O指令,程式中較難區分I/O操作。I/O介面的編址方式是由所選定的微處理器決定了的,介面設計時應按所選定的處理器所規定的編址方式來設計I/O介面地址譯碼器。但是獨立編址的微處理器的I/O介面也可以設計成統一編址方式使用,如在8086系統中,就可通過硬體將I/O介面的埠與儲存器統一編址。這時應在訊號或者號有效的同時,使M/訊號處於高電平,通過外部邏輯組合電路的組合,產生對儲存器的讀、寫訊號,CPU就可以用功能強、使用靈活方便的各條訪內指令來實現對I/O埠的讀、寫操作。