1. 程式人生 > >《現代作業系統》閱讀筆記——輸入輸出

《現代作業系統》閱讀筆記——輸入輸出

I/O硬體原理

  • I/O裝置

    • 塊裝置
      • 以塊為單位傳遞資訊
      • 所有塊都可以獨立於其他塊讀寫
    • 字元裝置
      • 以字元為單位傳遞資料
      • 不可定址
  • 記憶體對映I/O

    • 每個裝置都有一個裝置控制器,每個控制器都有幾個暫存器與CPU通訊
    • 通過讀取和寫入這些暫存器,作業系統可以控制和感知裝置狀態
    • 控制暫存器被對映到記憶體空間,並且確保該記憶體地址不會和虛擬記憶體重疊
    • 優點
      • 可以直接使用C等高階語言編寫I/O命令,而無需通過特殊的彙編程式碼訪問這些暫存器
      • 不需要特殊的保護機制防止使用者程序執行I/O操作(I/O操作只能由核心程序執行),只要避免和虛擬地址空間重疊便可
    • 缺點
      • 不可使用cache,否則裝置狀態的改變將不會被CPU發現,必須通過硬體支援禁用部分cache
  • 內部緩衝區

    • 裝置中的資料是先讀到內部的緩衝區中,再發往記憶體的
    • 原因
      • 裝置控制器可以在傳送前先校驗資料的正確性,避免傳遞錯誤資料
      • 當磁碟等裝置開始工作時,讀出資料是以一個固定速度而不管控制器是否準備好接受的,如果直接發往記憶體,那麼當匯流排忙時,控制器必須將讀出的資料存在別的地方,產生大量管理工作
  • 中斷

    • 精確中斷
      • 包含一個假設,即如果中斷在一個指令後發生,則包含該指令的前面所有指令都執行完畢,後面的指令都沒有執行
    • 不精確中斷
      • 現代CPU是流水線的,甚至是超執行緒的,當中斷訊號發生時,各個指令可能處於不同的執行狀態,PC無法準確反映執行完畢和未執行指令的邊界

I/O軟體原理

  • 裝置驅動程式
    • 驅動程式一般由硬體製造商編寫,為作業系統提供統一的介面
    • 由於裝置的執行可能被中斷,如網路驅動程式在接受程式包,所以驅動程式必須是可重入的
    • 即一個正在執行的驅動程式可以支援在第一次被呼叫完成前被第二次呼叫
    • 傳統的Unix系統在新增新裝置時必須重新編譯核心
      • 因為Unix系統一般由計算中心執行,I/O裝置幾乎不變
    • 現代的作業系統如linux和Windows可以動態地裝在新的裝置
    • 有些作業系統如minix將驅動程式執行在使用者空間而非核心空間
      • 這一構造消除了系統崩潰的主要源頭
  • 裝置保護
  • 系統如何防止無權訪問裝置的使用者訪問裝置呢?
    • 在linux等現代系統中,裝置是以檔案的形式出現的,於是對於檔案的常規保護規則也可使用與I/O裝置的保護
  • 如何防止某些程序長期空佔某些裝置(如印表機)呢?
    • 建立一個特殊的守護程序,該程序是允許使用印表機的唯一程序,將要列印的檔案都裝載到這個程序中