1. 程式人生 > >[作業系統] I/O硬體原理

[作業系統] I/O硬體原理

I/O硬體原理

1. I/O裝置分類

I/O裝置大致可以分為兩類:塊裝置和字元裝置。

  1. 塊裝置

    塊裝置把資訊儲存在固定大小的塊中,每個塊有自己的地址。所有傳輸以一個或多個完整的(連續的)塊為單位。塊裝置的基本特徵是每個塊都能獨立於其他塊而讀寫。硬碟和USB都是塊裝置。

  2. 字元裝置

    字元裝置以字元為單位傳送或接收一個字元流,而不考慮任何塊結構。字元裝置是不可定址的,也沒有任何尋道操作。印表機、滑鼠以及大多數與磁碟不同的裝置都可以看做字元裝置。

2. 裝置控制器

I/O裝置一般由機械部件和電子部件兩部分組成。電子部件稱作裝置控制器或介面卡,它經常以主機板上的晶片的形式出現。而機械部件就是裝置本身。

裝置控制器的任務是把序列的位流轉換為位元組塊,並進行必要的錯誤校正工作。位元組塊通常首先在控制器內部的一個緩衝區中按位進行組裝,然後在證明位元組塊沒有錯誤後,將其複製到記憶體中。

3. 裝置與CPU通訊方法

每個裝置控制器有幾個暫存器用來與CPU通訊。通過寫入這些暫存器,作業系統可以命令裝置傳送資料、接收資料、開啟或關閉,或者執行某些其他操作。通過讀取這些暫存器,作業系統可以瞭解裝置的狀態,是否準備好接收一個新命令等。

除此之外,許多裝置還有一個作業系統可以讀寫的資料緩衝區,可供程式或作業系統寫入資料。

為了實現CPU與裝置控制暫存器和資料緩衝區的通訊,有兩種辦法可以採用

  1. 單獨的I/O空間

    每個控制暫存器被分配一個I/O埠(一個8位或16位的整數)。所有的I/O埠形成一個I/O埠空間,並且受到保護使得普通使用者程式不能訪問。在這個方案中,I/O有自己的地址空間。

  2. 記憶體對映I/O

    將所有控制暫存器對映到記憶體空間中,每個控制暫存器被分配惟一一個記憶體地址,並且不會有記憶體被分配這一地址。

當CPU想要讀入一個字的時候,不論是從記憶體中讀入還是從I/O埠讀入,都將需要的地址放到地址匯流排,同時還需要另一條匯流排指示需要的是I/O空間還是記憶體空間。

對於第一種方案,I/O空間和記憶體空間分別響應符合的需求就可以了。

對於第二種方案,因為都在記憶體空間中,所以記憶體模組和I/O裝置需要將地址線和自己所服務的地址範圍相比較,若符合才會響應請求。

4. 記憶體對映I/O

將所有控制暫存器對映到記憶體空間中,每個控制暫存器被分配惟一一個記憶體地址,並且不會有記憶體被分配這一地址。

記憶體對映I/O

優點:

  • 裝置控制器只是記憶體中的變數,不需要特殊方法定址。

  • 不需要特殊的保護機制阻止使用者程序執行I/O操作,只需要避免將I/O控制暫存器對應的地址空間放入使用者程序虛擬空間。額外的好處是可以將不同的裝置驅動放在不同地址空間,防止驅動程式間的相互干擾。

  • 對於記憶體有用的指令,同樣可以用來使用控制暫存器。

缺點:

  • 要使用額外的機制禁止對裝置控制暫存器快取記憶體,因為第一次引用裝置可能導致它被快取記憶體,隨後的引用就只是從快取記憶體中取值而不是查詢裝置了。

  • 在多匯流排機器中(有單獨的記憶體匯流排),I/O裝置無法檢視記憶體地址,因為對記憶體的引用只在記憶體總線上。

    1. 第一種解決方法是首先將全部記憶體引用傳送到記憶體,如果記憶體響應失敗,CPU就放棄記憶體匯流排嘗試其他匯流排。

    2. 第二種方法是在記憶體總線上放置探查裝置,放過所有潛在地指向所關注的I/O裝置的地址。造成的問題是I/O裝置無法以記憶體所能達到的速度處理請求。

    3. 在PCI橋晶片中對地址進行過濾,預裝一個範圍暫存器,在暫存器中被標記為非記憶體的範圍的地址將轉發給PCI匯流排而不是記憶體。缺點是需要在預裝時就確定記憶體範圍。

5. 直接儲存器存取(DMA)

無論一個CPU是否具有記憶體對映I/O,都需要定址裝置控制器以便與它們交換資料。CPU可以從I/O控制器每次請求一個位元組資料,但是這樣會浪費CPU時間,於是用到了直接儲存器(Direct Memory Access, DMA)方案,這一方案需要一個叫做DMA控制器的硬體支援。

DMA

DMA控制器獨立於CPU而訪問系統匯流排。如圖所示,它包含若干個可以被CPU讀寫的暫存器,其中包括一個記憶體地址暫存器、一個位元組計數暫存器和一個或多個控制暫存器。控制暫存器指定要使用的I/O埠、傳送方向、傳送單位以及在一次傳送中要傳送的位元組數。

工作原理:

  1. 在沒有DMA時的讀磁碟操作

    • 首先,控制器從磁碟驅動器序列地、一位一位地讀一個塊,直到將整塊資訊放入控制器內部緩衝區中。
    • 接著,計算校驗和,以保證沒有錯誤發生。
    • 然後,控制器產生一箇中斷。
    • 最後,當作業系統開始執行時,重複地從控制器的緩衝區一次一個位元組地讀取該塊資訊,並存入記憶體中。
  2. 使用DMA時

    • 首先,CPU設定DMA控制器的暫存器對它進行程式設計,所以DMA控制器直到將資料傳送到哪裡(即上圖1)。
    • 接著,DMA控制器想磁碟控制器發出一個命令,通知它從從磁碟讀資料到其內部緩衝區中,並進行校驗。若資料有效,DMA控制器通過在總線上發出一個讀請求到磁碟控制器發起DMA傳送(即上圖2)。
    • 然後,將資料寫到記憶體中,當寫操作完成時,磁碟控制器在總線上發出一個應答訊號到DMA控制器。DMA控制器步增要使用的記憶體地址,並重覆上述過程直到傳送完所有資料。
      (即上圖3,4)。
    • 最後,DMA中斷CPU,通知CPU傳送完成,當作業系統開始工作時,資料已經存在於記憶體中了,不需要再次複製。

模式選擇:
許多匯流排能夠以每次一字模式和塊模式兩種方式操作,DMA也可以。

  1. 每次一字模式

    DMA控制器請求傳送一個字並且得到這個字。如果CPU也想使用匯流排,CPU必須等待。這一機制稱為週期竊取,因為裝置控制器偶爾從CPU偷走一個臨時匯流排週期,會輕微延遲CPU。

  2. 塊模式

    DMA控制器通知裝置獲得匯流排,發起一連串的傳送,然後釋放匯流排。之一機制叫做突發模式,比周期竊取效率更高,但是長時間突發傳送會長時間阻塞CPU和其他裝置。

  3. 飛越模式

    DMA控制器通知裝置控制器直接將資料傳送到主存,缺點是不靈活,不能執行裝置到裝置的複製。

為什麼要在DMA開始之前,磁碟要將資料讀入其內部緩衝區而不是使用飛越模式:

  1. 通過進行內部緩衝,磁碟控制器可以再開始傳送前檢驗校驗和,如果校驗和錯誤,就不會傳送,避免浪費。

  2. 一旦磁碟傳送開始工作,從磁碟讀出的資料就是以固定速率到達的,而不論控制器是否準備好接收資料。如果控制器將資料直接寫到記憶體,則必須要為傳送的每個字取得匯流排控制權。如果匯流排正忙,控制器必須等待,如果在前一個磁碟字還未被記憶體儲存時,下一個磁碟字到達,控制器必須將其存放在某個地方。使用內部緩衝區,可以再DMA啟動前避免使用匯流排。

6. 中斷

當一個I/O裝置完成工作時,就會通過在分配給它的一條匯流排訊號線上置起訊號來產生一箇中斷。該訊號被主機板上的中斷控制器檢測到,並決定下一步該做什麼。

中斷

如果這是沒有其他中斷未被處理,則中斷控制器立即對該中斷進行處理。如果有另一箇中斷正在被處理,或者另一個裝置在總線上具有更高優先順序的一條中斷請求線上同時發出中斷請求,該中斷將暫時不被處理。

中斷訊號會導致CPU停止當前的工作並開始做其他的事情。為了處理中斷,中斷控制器在地址線上放置一個數字標明哪個裝置需要關注,並且置起一箇中斷CPU的訊號。地址線上數字被用做指向一個稱為中斷向量的表格的索引,以便讀取一個新的程式計數器,這一程式計數器指向相應的中斷服務過程的開始。

中斷時,需要將程式計數器中的資訊儲存(也可以儲存其他資訊,但PC的資訊必須儲存以保證中斷程序可以重新開始)。儲存的位置可以有兩種選擇。

  1. 儲存在內部暫存器

    在需要時作業系統可以讀出內部暫存器,但是中斷控制器之後無法得到應答,直到所有可能的相關資訊被讀出,以免第二個中斷重寫內部暫存器。將造成長時間宕機並有可能丟失資料。

  2. 儲存在CPU堆疊

使用使用者堆疊可能會引發故障和不合法指標,使用核心堆疊可能會更改MMU上下文,從而造成TLB和快取記憶體大部分失效,浪費時間。

7. 精確中斷與不精確中斷

在現代使用流水線和超標量的計算機中,中斷不一定出現在每條指令執行後。即中斷髮生時,許多指令可能處在不同的執行階段。中段發生時,程式計數器無法正確地反應已經執行過的指令和未執行的指令。因為許多指令可能被部分執行了

  1. 精確中斷

    將機器留在一個明確的狀態稱為精確中斷,有4特性:

    1. PC(程式計數器)儲存在一個已知地方。
    2. PC所指向的指令之前的所有指令已經完全執行。
    3. PC所指向的指令之後的所有指令全都沒有執行。
    4. PC所指向的指令執行狀態已知。

    需要注意的是,對於PC指向的指令之後的指令,可以開始執行,但是需要在中斷髮生前撤銷他們對暫存器或記憶體等造成的修改。

  2. 不精確中斷

    不滿足上述提到的4個特性的中斷稱作不精確中斷。可以將一些致命的錯誤造成的中斷設計為不精確中斷。例如,除以0造成的編譯錯誤的中斷,因為不需要重新開始中斷前的程序。

精確中斷不精確中斷

參考書目:現代作業系統第三版