1. 程式人生 > 其它 >輸入輸出裝置

輸入輸出裝置

輸入輸出裝置的分類

可分為塊裝置和字元裝置

  • 塊裝置將資訊儲存在固定大小的塊中,每個塊有自己的位置。硬碟就是常見的塊裝置。

  • 字元裝置傳送或接收的是位元組流,不用考慮任何塊結構,沒有辦法定址。滑鼠就是常見的字元裝置。

因為塊裝置儲存的資料量比較大,一般會有緩衝區。CPU寫入緩衝區的資料攢夠一部分才會轉發給裝置。(CPU不會直接和裝置打交道,而是通過中間的裝置控制器進行處理,如硬碟有硬碟控制器,USB有USB控制器)

 

CPU如何與控制器進行通訊?

  • 每個控制器被分配一個I/O埠,可以通過特殊的彙編指令,如in/out操作這些暫存器。

  • 資料緩衝區,可記憶體對映I/O,直接分配一段記憶體空間給它,就像讀寫記憶體一樣讀寫資料緩衝區。如區域ioremap。

裝置讀取完後如何通知CPU呢

控制器的暫存器一般會有狀態標誌位,可以通過檢測狀態標誌位,來確定輸入或者輸出操作是否完成。那麼可以通過輪詢等待進行判斷,也可以通過中斷的方式,通知作業系統輸入輸出操作已經完成。

 

中斷的分類

中斷有兩種,一種是通過程式碼呼叫INT產生軟中斷。一種是硬體中斷,通過中斷控制器觸發的。

除了中斷通知CPU的方式,還可以通過DMA的方式讀取或寫入大量資料。DMA可以在CPU不參與的情況,自動完成對記憶體的讀寫。

中斷處理流程

  • 外部裝置給中斷控制器傳送物理中斷訊號

    • 中斷控制器將物理中斷訊號轉換成為中斷向量 interrupt vector,發給各個 CPU

      • 每個 CPU 都會有一箇中斷向量表,根據 interrupt vector 呼叫一個 IRQ 處理函式。注意這裡的 IRQ 處理函式還不是咱們上面指定的 irq_handler_t,到這一層還是 CPU 硬體的要求

        • 在 IRQ 處理函式中,將 interrupt vector 轉化為抽象中斷層的中斷訊號 irq,呼叫中斷訊號 irq 對應的中斷描述結構裡面的 irq_handler_t

字元裝置總結

 

  • 需要裝置驅動程式的ko模組,裡面有模組初始化函式,中斷處理函式,裝置操作函式。這裡面封裝了對於外部裝置的操作。

  • 在/dev目錄下有一個檔案表示這個裝置,這個檔案在特殊的devtmpfs檔案系統上,因而也有相應的dentry和inode。這裡的inode是一個特殊的inode,裡面有裝置號。通過該inode可以找到驅動程式。

  • 開啟字元裝置檔案和開啟普通檔案有相似之處。都有檔案描述符,struct file,指向字元裝置檔案的dentry和inode。