輸入輸出裝置
可分為塊裝置和字元裝置
-
塊裝置將資訊儲存在固定大小的塊中,每個塊有自己的位置。硬碟就是常見的塊裝置。
-
字元裝置傳送或接收的是位元組流,不用考慮任何塊結構,沒有辦法定址。滑鼠就是常見的字元裝置。
因為塊裝置儲存的資料量比較大,一般會有緩衝區。CPU寫入緩衝區的資料攢夠一部分才會轉發給裝置。(CPU不會直接和裝置打交道,而是通過中間的裝置控制器進行處理,如硬碟有硬碟控制器,USB有USB控制器)
CPU如何與控制器進行通訊?
-
每個控制器被分配一個I/O埠,可以通過特殊的彙編指令,如in/out操作這些暫存器。
-
資料緩衝區,可記憶體對映I/O,直接分配一段記憶體空間給它,就像讀寫記憶體一樣讀寫資料緩衝區。如區域ioremap。
裝置讀取完後如何通知CPU呢
控制器的暫存器一般會有狀態標誌位,可以通過檢測狀態標誌位,來確定輸入或者輸出操作是否完成。那麼可以通過輪詢等待進行判斷,也可以通過中斷的方式,通知作業系統輸入輸出操作已經完成。
中斷的分類
中斷有兩種,一種是通過程式碼呼叫INT產生軟中斷。一種是硬體中斷,通過中斷控制器觸發的。
除了中斷通知CPU的方式,還可以通過DMA的方式讀取或寫入大量資料。DMA可以在CPU不參與的情況,自動完成對記憶體的讀寫。
中斷處理流程
-
外部裝置給中斷控制器傳送物理中斷訊號
-
-
中斷控制器將物理中斷訊號轉換成為中斷向量 interrupt vector,發給各個 CPU
-
-
-
-
在 IRQ 處理函式中,將 interrupt vector 轉化為抽象中斷層的中斷訊號 irq,呼叫中斷訊號 irq 對應的中斷描述結構裡面的 irq_handler_t
-
-
-
字元裝置總結
-
需要裝置驅動程式的ko模組,裡面有模組初始化函式,中斷處理函式,裝置操作函式。這裡面封裝了對於外部裝置的操作。
-
在/dev目錄下有一個檔案表示這個裝置,這個檔案在特殊的devtmpfs檔案系統上,因而也有相應的dentry和inode。這裡的inode是一個特殊的inode,裡面有裝置號。通過該inode可以找到驅動程式。
-