- 有了存儲器就足夠了嗎?不,還差最後一步的包裝
- 即外設
- 諸如顯示屏、鍵盤、鼠標、音響等等,這些纔是我們直接可以接觸到的計算機
- 這些設備,如顯示屏,是接收圖像的數據並顯示出來;而鼠標、鍵盤則屬於輸入設備,這些數據是某程序運行所需要用到的,比如我現在正在打字的火狐瀏覽器
- 也就是說,外設也需要也需要數據,這些數據也要被CPU來處理,而這些數據的傳輸也需要在控制之下
I/O技術
無I/O技術
- 最初電腦的輸入用……紙帶……恐怕那個時候只有研究人員用電腦?……
程序查詢I/O
- I/O設備的工作全由CPU來控制
- CPU主動查詢I/O設備的狀態,若檢測到數據就緒,則交換/處理一個數據字,否則繼續查詢
- I/O設備直接與CPU相連導致更換I/O設備困難
- 而CPU在控制I/O設備的時候,只是在控制而已,CPU本身應該是用來運算的,而在I/O的時候卻閒置了;而且由於需要CPU主動的查詢,所以就算I/O設備沒有準備好,也同樣會消耗CPU時間
程序中斷方式
- 首先改進的就是,讓準備好的I/O設備來通知CPU
- CPU這個時候一般是在幹活的,所以就需要先放下手頭的工作來處理I/O。
- 不過一次只能處理一個數據字。
- 中斷是需要保護現場的,即CPU當前工作的所有狀態,以便可以恢復繼續工作
DMA直接內存讀取
- 後來發現,I/O操作和CPU的關係,只不過是I/O需要讀/寫命令、寫入的主存地址、傳送的數據個數,而已
- 這麼簡單的活交給CPU簡直浪費啊
- 引入DMA控制器:CPU處理I/O是往DMA控制器寫入外設地址、主存地址和計數器,剩下的由DMA控制器來控制
Channel通道技術
- DMA還不夠強大
- 通常一個DMA只能服務一個外設
- DMA控制器一次控制傳輸的數據有限,還需要多次CPU的介入
- 通道則更爲強大
- 它是一個協處理器
- CPU通過I/O指令來控制通道工作
- 而通道可以執行專門的通道指令來控制I/O的工作
PPU外圍處理機
- 通道還是受限於CPU的控制
- PPU則完全獨立於CPU,全權負責I/O
I/O接口
- 衆多外設各不相同,其數據交換也不同
- 但本質都是外設的數據,所以就可以用一層I/O接口來屏蔽掉雙方的差異
- CPU只需要考慮I/O接口的構成
- 外設也是只需要考慮I/O接口
功能
- 地址識別和設備選擇:既然也是數據,就要有自己的地址;既然又是設備,就要對應好外設
- 接收、保存CPU的I/O控制命令:放在接口的控制寄存器
- 反應外設的工作狀態:如數據狀態(是否就緒)、工作狀態(忙、空閒)
- 信號轉換:屏蔽掉外設的工作邏輯、時序等等
- 數據格式、碼制的轉換及數據檢錯、糾錯
- 傳送數據
- 中斷
組成
- 數據緩衝寄存器:數據端口:交換的數據
- 端口地址譯碼器
- 接口控制邏輯
- 中斷邏輯
- 狀態寄存器 :狀態端口:外設狀態
- 命令寄存器:控制端口:工作內容、工作方式
編址
- I/O端口是按地址來訪問的
- 獨立編址
- 單獨外設的地址
- 需要專門的I/O指令來區分開主存地址
- 統一編址
- 主存地址空間一部分劃爲I/O端口的地址範圍
- 將I/O端口視爲主存的一部分
中斷
- CPU如何處理中斷請求信號
響應
- 信號
- 控制總線
- 接受中斷請求針腳 INTR
- 發出中斷響應針腳 INTA
- 中斷允許標誌 EINT(=1允許中斷)
- 開中斷命令 STI(置EINT爲1)
- 關中斷命令 CLI(置EINT爲0)
- 控制總線
- 響應條件
- CPU收到中斷請求
- EINT=1
- 指令剛剛執行完
- CPU工作
- 進入中斷週期,置中斷狀態觸發器INT爲1
- 發出中斷響應信號
- 保存斷點和狀態(即PC和標誌寄存器,其餘寄存器由中斷服務程序的保護現場來保存)
- 關中斷
- 接受中斷類型碼,生成中斷服務程序的入口地址
- 軟件查詢法 :
- 硬件向量法:中斷源收到INTA後生成一個特定的向量地址(中斷類型號),CPU根據它來生成入口地址
- 執行中斷處理程序
中斷過程
- 中斷請求:中斷源通過INTR針腳向CPU發出請求信號
- 中斷判優:多箇中斷信號的優先級排序
- 中斷響應:若EINT爲1,CPU會在指令執行完後掃描INTR看看是否有中斷請求,有則置INT爲1,進行上述的CPU工作
- 中斷處理:由預先編制的中斷服務程序完成
- 保護現場
- 中斷服務
- 恢復現場
- 開中斷:EINT置1
- 中斷返回:IRET,將PC和標誌寄存器恢復(恢復斷點)
中斷屏蔽
- 中斷也可以被中斷
- 這樣就相當於改變了中斷的優先級
- 需要設置中斷屏蔽字,來判斷當前中斷能否被下一個中斷來中斷
DMA
組成
- 主存地址寄存器AR
- 字計數器WC
- 設備地址寄存器DAR
- 中斷邏輯
- 控制/狀態邏輯
工作
- 預處理:CPU執行I/O指令,選擇DMA控制器和I/O接口,外設地址、主存地址和個數寫入DMA控制器,I/O接口啓動外設
- 數據傳輸:DMA控制器控制下,完成主存與I/O接口之間的傳輸
- 後處理:當WC的個數傳輸完,DMA控制器向CPU發出中斷請求
- 如果數據有錯,重新發送
- 如果還有數據,再啓動新一輪DMA
- 如果結束,CPU向DMA控制器發送結束信號EOP
數據傳送
- I/O接口在數據就緒時向DMAC發出DMA請求信號DREQ
- DMAC向CPU發出佔用總線信號HOLD
- CPU決定是否讓出總線,如果讓出則發送總線允許信號HLDA
- DMAC接收到HLDA獲取總線控制權,向I/O接口輸出DMA應答信號DACK
- DMAC向系統總線發出讀寫命令和訪存地址,I/O接口開始與系統總線交換數據
- DMA數據傳輸結束,AR增1,WC減1 (即一次傳送一個數據字)
- DMAC撤銷HOLD信號,釋放總線
CPU和DMA和BUS
- DMAC接收到HLDA後一直佔用BUS直到傳輸完畢
- DMAC在CPU不使用BUS的時候使用一個週期的BUS來傳輸一個數據字
- CPU和DMA交替使用BUS:CPU工作週期比主存訪問週期長得多的時候使用這種方式,分爲子週期,分別讓CPU和DMA使用總線,此時DMA無須請求總線
Channel
- CPU管理DMA都是一些簡單的命令,可以交給一個協處理器來完成
- 通道就是一個簡單的微處理器和DMA控制器的集成
改進CPU
- CPU的管態、目態和訪管指令
- I/O指令只能在管態下,由OS執行
- 廣義I/O指令在目態下執行
- 啓動I/O指令
功能
- 接受CPU的I/O指令,選擇外設與通道相連
- 執行CPU編制的通道程序
- 給出外設地址
- 給出主存地址
- 控制交換個數
- 檢查外設狀態
- 格式轉換
- 結束操作
工作
- 用戶程序執行廣義I/O指令,進入管態
- CPU響應中斷,執行I/O管理程序,其根據廣義I/O指令的參數,針對特定通道使用通道命令編寫通道程序,該程序最後一條爲“無鏈通道指令”——停止通道工作,並向CPU發中斷。
- 通道程序寫到主存中,將入口地址寫入主存中預先劃分的“通道地址字”單元,執行啓動I/O指令。再由通道來執行通道程序
- 通道程序執行完,向CPU發送中斷信號,CPU響應並進入管態,執行管理程序來完成結束操作