外設(shè)端口是如何獲得地址的
計算機與外設(shè)是通過端口來交換信息的,外設(shè)的每個端口都必須有自己的地址,cpu才能找到這些端口,那么,這些端口的地址是如何得到的呢?




統(tǒng)一編址和獨立編址最重要的區(qū)別就在于,在統(tǒng)一編址的時候,外設(shè)端口和內(nèi)存單元完全一樣,每個外設(shè)端口的地址占用一個內(nèi)存單元的地址,兩者不能重復,也不能區(qū)分;獨立編址的時候,外設(shè)端口的地址和內(nèi)存地址是分開來的,兩者地址可以相同,但使用的讀寫命令不同。

由上圖可以看出,圖中的8255芯片地址是90H,91H,等等。由于8255一共四個端口,其中的A1A0用來確定具體哪個端口,而A7-A2我們則可以推出是100100,再假設(shè)A1A0就構(gòu)成地址100100A1A0,也就是90H--93H。這就是端口編址的意思。

上圖是8255的四個端口。

上圖是8253與cpu的連接。這里8253的地址都是偶地址,因為cpu說的A0地址線一直是低電平有效,而8253的四個端口地址則由CPU的A2A1確定,也就是8253上面的A1A0確定,但要注意的是,最終的地址是以cpu的地址線為準的。

上圖是8253結(jié)構(gòu)圖。
上面的例子都是獨立編址的,因為cpu訪問這些端口的指令都是IN和OUT,而不是MOVE。

對于ARM架構(gòu)的處理器,都是IO與內(nèi)存統(tǒng)一編址:
(1)類似于訪問內(nèi)存的方式,即把外設(shè)的寄存器當作一個內(nèi)存地址來讀寫,從而以訪問內(nèi)存相同的方式來操作外設(shè),叫IO與內(nèi)存統(tǒng)一編址方式
(2)例如ARM架構(gòu)下,我們寫的代碼要適應(yīng)ARM架構(gòu)的IO與內(nèi)存統(tǒng)一編址的情況,所有我們訪問IO的時候,也就是讀寫寄存器,讀寫硬件就是在進行IO,IO和內(nèi)存一樣也有個地址(內(nèi)核統(tǒng)一編址機制已經(jīng)做好代碼定義),被統(tǒng)一化了。

也就是說。如果是統(tǒng)一編址,就無法在指令上去區(qū)分是內(nèi)存單元還是外設(shè)端口。
無論統(tǒng)一還是獨立編址,外設(shè)端口的地址都來源于cpu的地址線。