摘要
- 裝置控制器
- IO控制方式
- 裝置驅動程式
- 儲存系統IO分層
裝置控制器
為什麼需要裝置控制器?
電腦可以外接很多裝置,如鍵盤、滑鼠、硬碟、顯示器、網絡卡等,每個裝置的用法和功能不同,作業系統為了對這些輸入輸出裝置進行統一管理,必須要遮蔽裝置之間的差異,因此需要裝置控制器。
裝置控制器的特點?
- 裝置控制器必須要清楚的知道裝置的用法和功能,這樣CPU可以透過和裝置控制器互動來控制裝置。
- 裝置暫存器裡面含有晶片,可以執行自己的邏輯
- 裝置暫存器裡面有暫存器,用來與CPU進行通訊
裝置控制器中暫存器的作用?
- 透過寫入暫存器,作業系統可以讓裝置傳送資料、接收資料、開啟或關閉,或者執行某些其他操作
- 透過讀取暫存器,作業系統可以瞭解裝置的狀態,是否準備好接收一個新的指令等
裝置控制器中暫存器的種類有哪些?
- 資料暫存器:CPU向IO裝置寫入需要傳輸的資料
- 命令暫存器:CPU傳送一個命令,告訴IO裝置要進行輸入輸出操作,於是就會交給IO裝置去工作,任務完成以後,會把狀態暫存器裡面的狀態標記為已完成。
- 狀態暫存器:目的是告訴CPU,現在的工作已完成或者在進行中,如果是在進行中狀態,CPU再發送資料和指令過來都是無用的,直到工作完成,狀態暫存器修改為已完成,CPU傳送的資料和指令才能被處理
輸入輸出裝置大體分為哪幾類?
- 塊裝置:把資料儲存在固定的塊中,每個塊都有自己的地址,比如磁碟、USB都是常見的塊裝置
- 字元裝置:以字元為單位傳送或接收一個字元流,字元裝置不可定址,沒有尋道操作,比如滑鼠
裝置控制器中資料緩衝區的作用?
塊裝置傳輸的資料量往往比較大,為了減少對裝置的頻繁操作,需要藉助資料緩衝區:
- CPU寫入資料到控制器的緩衝區,等積累到一定的量時,再發送給裝置
- CPU從控制器的緩衝區讀入資料時,也需要等緩衝區積累到一定的量時,才複製到記憶體
CPU和裝置控制器的通訊方式有哪幾種?
- 埠IO:每個控制暫存器被分配一個IO埠,可以透過特殊的彙編指令操作這些暫存器,比如in/out類的指令
- 記憶體對映IO:將所有的控制暫存器對映到記憶體空間,這樣可以像讀寫記憶體一樣讀寫資料緩衝區
IO控制方式
裝置控制器讀取完資料後,如何通知CPU?
- CPU自己輪詢
- 中斷
- DMA控制器
CPU自己輪詢的缺點?
CPU需要一直查詢控制器中暫存器的狀態,直到暫存器的狀態變為已完成,這種方式會佔用大量的CPU時間
中斷的缺點?
中斷雖然能解決輪詢的缺點,但對於頻繁讀寫磁碟並不友好,因為這樣CPU會經常性被打斷,佔用了大量的CPU時間。
什麼是DMA?
DMA可以使得裝置在CPU不參與的情況下,能夠自行將IO資料放入記憶體,實現DMA必須要有DMA控制器硬體的支援。
DMA控制器的工作方式?
- CPU對DMA控制器下發指令,告訴它需要讀取多少資料,讀取的資料放在記憶體的哪個位置
- DMA控制器向磁碟控制器下發指令,通知磁碟控制器讀取資料到其內部緩衝區域
- 接著磁碟控制器將緩衝區域的資料傳輸到記憶體
- 傳輸操作完成以後,磁碟控制器在總線上傳送一個確認成功的訊號到DMA控制器
- DMA控制器收到訊號以後,傳送中斷通知給CPU,CPU就可以利用記憶體中的資料了
裝置驅動程式
為什麼需要裝置驅動程式?
裝置控制器雖然遮蔽了裝置的細節,但每種裝置控制器的暫存器、緩衝區等的使用模式不同,因此引入了裝置驅動程式遮蔽裝置控制器的差異。
裝置控制器屬於硬體範疇,但裝置驅動程式屬於作業系統的一部分。作業系統的核心程式碼可以像本地呼叫一樣使用驅動程式的介面。
驅動程式處理中斷
裝置控制器在完成任務以後,會發出中斷訊號,此時CPU收到中斷指令以後,往往會對中斷進行響應,而響應的處理函式往往在驅動程式中,因此驅動程式初始化的時候,要先註冊一個該裝置的中斷處理函式。
中斷處理流程
- 裝置控制器準備好資料時,會透過中斷控制器向CPU發出中斷請求
- CPU響應中斷請求,儲存當前程序的上下文資訊
- 轉入響應的中斷函式處理函式
- 進行中斷處理
- 中斷處理完成以後,恢復被中斷程序的上下文
儲存系統IO分層
Linux的儲存系統的IO由上到下可以分為三個層次,分別是:
- 檔案系統層
- 通用塊層
- 裝置層
- 檔案系統層:包括虛擬檔案系統和其他檔案系統的具體實現,向上為應用程式統一提供了標準的檔案訪問介面,向下會透過通用塊層來儲存和管理磁碟資料
- 通用塊層:包括塊裝置的IO佇列和IO排程器,它對檔案系統的IO請求進行排隊,再透過IO排程器,選擇一個IO發給下層的裝置層
- 裝置層:包括硬體裝置、裝置控制器和驅動程式,負責物理裝置的IO