8086-5-CPU如何與外圍設備交互(8086)


CPU如何與外圍設備交互(8086)

外圍設備

和處理器進行交互的硬件有很多,比如:硬盤,顯示器、網絡設備、揚聲器和麥克風、鍵盤、鼠標等。

根據應用的場合,還會對接一些沒見過的設備。

所有連接的硬件設備,都在計算機主機附近,爭着跟計算機交互,這樣的硬件設備叫做外圍設備(Peripheral Equipment)。

一般把這些外圍設備分成兩種,一種是輸入設備,比如鍵盤、鼠標、麥克風、攝像頭等;另一種是輸出設備,比如顯示器、打印機、揚聲器等。

輸入設備和輸出設備統稱為輸入輸出(Input/Output,I/O)設備。

每種設備的工作方式都不一樣。不同的設備,有不同的連線數量,線里面傳送的信號也不 一樣,而且各自的插頭和插孔也千差萬別。難么這些設備如何與CPU進行交互呢?

外圍設備如何與CPU進行交互:

外圍設備和CPU通過一個I/O 接口媒介來進行交互。

I/O 接口:

這個I/O 接口可能是一個電路板,也可能是一塊小芯片,這取決於它有多復雜。無論如何,它是一個典型的變換器,或者說是一個翻譯器,在一 邊,它按處理器的信號規程工作,負責把處理器的信號轉換成外圍設備能接受的另一種信號;在另一邊,它也做同樣的工作,把外圍設備的信 號變換成處理器可以接受的形式。 例如:顯卡接受CPU的信息然后轉化成顯示器可以接受的來處理。

CPU如何選擇I/O接口:

外圍設備非常多,所以也就有很多的I/O接口,CPU需要選擇I/O接口進行交互。

不可能將所有的I/O 接口直接和處理器相連,設備那么多,而且還有設備現在沒有發明出來,將來可能有。所以為了可拓展性,CPU采用總線技術來將所有外部設備捆綁在一起。再有新的設備就直接添加到總線上就行了。

(總線可以認為是一排電線,包含所有的外圍設備,包括處理器,都連接到這排電線上。每個連接到這排電線上的器件都必須有開關,以使它們隨時進行連接或斷開。這就好比是公共車道,當路面上有車時,你就必須退避一下,不能硬沖上去得等別人走完了你才可以,也就是說一個外圍設備在進行交互時另外的外圍設備不可以進行交互。因此,這排公共電線 就稱為總線(Bus))。

比如:

 

 

每個設備的I/O 接口都搶着和處理器交互這肯定會導致沖突,於是又引入了輸入輸出控制設備集中器(I/O Controller Hub,ICH)芯片,該芯片的作用是連接不同的總線,並協調各個I/O 接 口對處理器的訪問。

 

 

一個外部設備需要將I/O接口插到ICH的總線上,然后ICU通過ICH中提供和外部設備進行對接的的總線進行抉擇然后將抉擇后的I/O接口和CPU的總線進行對接。這樣一來,1是解決了添加設備的問題,2是解決了如何抉擇I/O接口的問題。

當處理器想同某個設備交互時時,ICH 會接到通知。然后,提供相應的傳輸通道和其他輔助支持,並命令所有其他無關設備禁止交互。同樣,當某個設備要跟處理器說話,情況也是一樣。

I/O 端口

雖然外圍設備和處理器之間的交互是通過相應的I/O 接口進行的。但是具體的來說:處理器其實是通過端口(Port)來和外圍設備進行交互的。本質上,端口就是一些寄存器,類似於處理器內部的寄存器,類似於緩存。不同之處在於,這些叫做端口的寄存器位於I/O 接口電路中。

端口是處理器和外圍設備實際交流的窗口,每一個I/O 接口都可能擁有好幾個端口,分別用於不同的目的。

比如,連接硬盤的 PATA/SATA 接口就有幾個端口,分別是命令端口(當向該端口寫入0x20 時,表明是從硬盤讀數據;寫入0x30 時,表明是向硬盤寫數據)、狀態端口(處理器根據這個端口的數據來判斷硬盤工作是否正常,操作是否成功,發生了哪種錯誤)、參數端口(處理器通過這些端口告訴硬盤讀寫的扇區數量,以及起始的邏輯扇區號)和數據端口(通過這個端口連 續地取得要讀出的數據,或者通過這個端口連續地發送要寫入硬盤的數 據)。

端口的實現方式:

端口是位於I/O 接口上的寄存器,所以,每個端口有自己的數據寬度。在早期的系統中,端口可以是8 位的,也可以是16 位的,現在有些端口會是32 位的。到底是8 位還是16 位,這是設備和I/O 接口制造者的自由。

端口在不同的計算機系統中有着不同的實現方式。一般分為兩種,映射到內存地址空間和獨立編址。

映射到內存空間:

計算機將端口號映射到內存地址空間。比如,0xE0001~0xFFFFF 是從很多I/O 接口那里映射過來的,當訪問這部分地址時,實際上是在訪問I/O 接口。

獨立編址:

端口獨立編址不和內存發生關系。在這種計算機中,處理器的地址線既連接內存,也連接每一個I/O 接口。但是,處理器還有一個特殊的引腳M/IO#,在這里,“#”表示低電平有效。也就是說,當處理器訪問內存時,它會讓 M/IO#引腳呈高電平,這里,和內存相關的電路就會打開;相反,如果處 理器訪問I/O 端口,那么M/IO#引腳呈低平,內存電路被禁止。與此同時,處理器發出的地址和M/IO#信號一起用於打個某個I/O 接口,如果該 I/O 接口分配的端口號與處理器地址相吻合的話。

image-20211230011247124

如何使用Intel 8086的端口:

Intel 處理器,早期是獨立編址的,現在既有內存映射的,也有獨立 編址的。在8086中為獨立編址的端口。

所有端口都是統一編號的,比如0x0001、0x0002、0x0003、…。每 個I/O 接口電路都分配了若干個端口,比如,I/O 接口A 有3 個端口,端口號分別是0x0021~0x0023。

在Intel 的系統中,只允許65536(十進制數)個端口存在,端口號 從0 到65535(0x0000~0xffff)。因為是獨立編址,所以,端口的訪問 不能使用類似於mov 這樣的指令,取而代之的是in 和out 指令。

所以我們直接采用In/Out指令就可以在8086CPU的世界中操控CPU和外部設備進行讀寫了。

小結:

CPU如何於外部設備進行交互是一個看試很繁瑣的事情,但是如果我們將其一步步細分就不是很麻煩了。

首先CPU通過接口和外部設備進行交互,然后由於外部設備可能很多而且每個都想交互所以需要選擇就引入了ICH,然后CPU就通過ICH來和外部設備接口進行交互。

然后接口是一個大的東西,內部還可以細分為端口,端口包含在接口里,就好比Byte 內部包含了8個bit這種關系,所以最終是通過端口來讀寫。

最后簡化為,CPU和外部設備只需要對端口進行修改就可以了,因為中間過程由ICH來處理了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM