IO軟件的設計目標:
(1)高效率:改善設備效率,尤其是磁盤I/O操作的效率
(2)通用性:用統一的標准來管理所有設備
IO軟件的設計思路: 把軟件組織成層次結構,低層軟件用來屏蔽硬件細節,高層軟件向用戶提供簡潔、友善的界面
IO軟件設計中主要考慮的問題:
(1)設備無關性:編寫訪問文件的程序與具體設備無關
(2)出錯處理:低層軟件能處理的錯誤不讓高層軟件感知
(3)同步/異步傳輸:支持阻塞和中斷驅動兩種工作方式
(4)緩沖技術:建立數據緩沖區,提高吞吐率
I/O軟件的層次結構:


- I/O中斷處理程序
位於操作系統底層,與硬件設備密切相關,與系統其余部分盡可能少地發生聯系
進程請求I/O操作時,通常被掛起,直到數據傳輸結束后並產生I/O中斷時,操作系統接管CPU后轉向中斷處理程序
當設備向CPU提出中斷請求時,CPU響應請求並轉入中斷處理程序
功能:檢查設備狀態寄存器內容,判斷產生中斷的原因,根據I/O操作的完成情況進行相應的處理
- 如果數據傳輸有錯,向上層軟件報告設備的出錯信息,實施重新執行
- 如果正常結束,喚醒等待傳輸的進程,使其轉換為就緒態
- 如果有等待傳輸的I/O命令,通知相關軟件啟動下一個I/O請求
- 設備驅動程序
包括與設備密切相關的所有代碼,從獨立於設備的軟件中接收並執行I/O請求
把用戶提交的邏輯I/O請求轉化為物理I/O操作的啟動和執行;監督設備是否正確執行,管理數據緩沖區,進行必要的糾錯處理
功能:
- 設備初始化:在系統初次啟動或設備傳輸數據時,預置設備和控制器以及通道狀態
- 執行設備驅動例程:負責啟動設備,進行數據傳輸;對於具有通道方式,還負責生成通道指令和通道程序,啟動通道工作
- 調用和執行中斷處理程序:負責處理設備和控制器及通道所發出的各種中斷
設備驅動程序分為:
(1)整體驅動程序直接向操作系統提供接口和控制硬件。適用於功能簡單的驅動程序,效率較高,但較難遷移
(2)分層驅動程序將驅動程序分成多層,放在棧中,系統接到I/O請求時先調用棧頂的驅動程序,棧頂的驅動程序可以直接處理請求或向下調用更低層的驅動程序,直至請求被處理,適用於功能復雜、重用性要求較高的驅動程序,結構清晰且便於移植,但會增加一部分系統開銷。
外設種類繁多、其控制接口不一,導致不同外設的設備驅動程序千差萬別, 因而設備驅動程序與設備相關每個設備驅動程序只處理一種設備,或者一類緊密相關的設備。每個外設或每類外設都有一個設備控制器,其中包含各種I/O端口。 CPU通過執行設備驅動程序中的I/O指令訪問各種I/O端口。設備所采用的I/O控制方式不同,驅動程序的實現方式也不同:
- 程序直接控制:驅動程序完成用戶程序的I/O請求后才結束。這種情況下,用戶進程在I/O過程中不會被阻塞,內核空間的I/O軟件一直代表用戶進程在內核態進行I/O處理 。
- 中斷控制:驅動程序啟動第一次I/O操作后,將調出其他進程執行,而當前用戶進程被阻塞。在CPU執行其他進程的同時,外設進行I/O操作,此時, CPU和外設並行工作。外設完成I/O時,向CPU發中斷請求,然后CPU調出相應中斷服務程序執行。在中斷服務程序中再次啟動I/O操作。
- DMA控制:驅動程序對DMA控制器初始化后,便發送“啟動DMA傳送” 命令,外設開始進行I/O操作並在外設和主存間傳送數據。同時CPU執行處理器調度程序,轉其他進程執行,當前用戶進程被阻塞。DMA控制器完成所有I/O任務后,向CPU發送一個“DMA完成”中斷請求信號。
- 獨立於設備的I/O軟件
執行適用於所有設備的常用I/O功能,功能包括:
(1)設備驅動程序統一接口:
操作系統為所有外設的設備驅動程序規定一個統一接口,這樣,新設備的驅動程序只要按統一接口規范來編制,就可在不修改操作系統的情況下,添加新設備驅動程序並使用新的外設進行I/O。
所有設備都抽象成文件,設備名和文件名在形式上沒有差別,設備和文件具有統一的接口,不同設備名和文件名被映射到對應設備驅動程序。
(2)設備命名:通過路徑名尋址設備
(3)設備保護:檢查用戶是否有權訪問所申請設備
(4)提供與設備無關的數據單位:字符數量,塊尺寸
例如,為了為所有的塊設備、字符設備提供一個統一的抽象視圖,以隱藏不同塊設備、字符設備之間的差異,與設備無關的I/O軟件為所有塊設備、字符設備設置統一的邏輯塊大小。這樣,高層I/O軟件就只需處理簡化的抽象設備,從而在高層軟件中簡化了數據定位等處理 。
(5)緩沖技術:傳輸速率、時間約束,不能直接送達目的地。每個設備的I/O都需使用內核緩沖區,因而緩沖區的申請和管理等處理是所有設備公共的,可包含在與設備無關的I/O軟件部分
(6)設備分配和狀態跟蹤:分配不同類型的設備
(7)錯誤處理和報告:
I/O操作在內核態執行時所發生的錯誤信息,都通過與設備無關的I/O軟件返回給用戶進程,也即:錯誤處理框架與設備無關。
直接返回編程等錯誤,無需設備驅動程序處理,如請求了不可能的I/O操作、寫信息到一個輸入設備或從一個輸出設備讀信息、指定了一個無效緩沖區地址或者參數、指定了不存在的設備等。
有些錯誤由設備驅動程序檢測出來並處理,若驅動程序無法處理,則將錯誤信息返回給設備無關I/O軟件,再由設備無關I/O軟件返回給用戶進程,如寫一個已被破壞的磁盤扇區、打印機缺紙、讀一個已關閉的設備等。
(8)打開和關閉文件:
對設備或文件進行打開或關閉等I/O函數所對應的系統調用,並不涉及具體的I/O操作,只要直接對主存中的一些數據結構進行修改即可 ,這部分工作也由設備無關軟件來處理。
- 用戶空間的I/O軟件
庫函數:一小部分I/O軟件不在操作系統中,是與應用程序鏈接在一起的庫函數,甚至完全由運行於用戶態的程序組成。系統調用通常由庫函數封裝后供用戶使用,封裝函數只是將系統調用所用的參數放在合適位置,然后執行訪管指令來陷入內核,再由內核函數實現真正的I/O操作。
SPOOLing軟件:在內核外運行的系統I/O軟件,采用預輸入、緩輸出和井管理技術,通過創建守護進程和特殊目錄解決獨占型設備的空占問題