現今電腦系統中包含了一個或數個 CPU,以及多個連接在 common bus 上個多個 device controller,每種不同的 device controller 用來處理不同的設備,如下圖所示:
CPU 與其他 device controller 可以一起執行,並相互競爭取得 memory cycle;而為了確保不同設備可以依序的存取 shared memory,memory controller 必須提供不同設備同步存取記憶體的方法。
當電腦剛開機時,第一個執行的程式稱為「bootstrap」,而 bootstrap 通常存放在硬體的 firmware 中,目的是用來載入 & 啟動 OS kernel。
為了做到上述工作,bootstrap 就必須知道 OS 存放的記憶體位址,才有辦法順利載入執行,而 OS 載入後所執行的第一個 process,一般稱為「init」,並等待其他軟/硬體觸發事件以進行處理。
硬體是透過傳遞訊號給 CPU 來觸發 interrupt,而軟體則是透過呼叫 system call 來觸發 interrupt;當 CPU 收到 interrupt 訊號,會執行以下動作:
- 立即停止目前工作
- 將所要執行的工作傳到特定的位址執行(此位址即為提供執行工作服務的起始位址)
- 當工作執行完畢,CPU 則會恢復中斷前的運作
下圖展示出 CPU 執行與工作執行的時間軸:
Interrupt(中斷) 在電腦架構中是非常重要的一個環節,也許不同的電腦會有不同處理 interrupt 的機制,但總是會有共同的部分,當 CPU 收到 interrupt 的訊號時,就會暫停手邊工作,並將 interrupt 丟給合適的中斷處理程序進行處理。
最直接的實作方式是有一個專門的程序(routine),會針對收到的 interrupt 訊號資訊,將其丟給相對應的中斷處理程序處理。
另外一種不需要專門程序處理中斷的方式,則是有一個存放「指向 interrupt routines 的指標(pointer)的表格」,因此 interrupt routine 可以直接透過此 table 儲存的 pointer 進行呼叫,而不需要有個專門的代理程序來處理這個部分。
每個不同設備所產生的 interrupt 都會有不同的 interrupt routine 來處理,並會以唯一的設備編號作為索引,而這些資訊都會儲存在記憶體最前面的位址。
Storage Structure
主記憶體是 CPU 唯一可以直接存取的區域,而兩者之間的互動是透過 CPU 呼叫 store & load 兩個指令,將資料在 memory & register(暫存區)。
其中 load 的作用是將長度為 1 個 word 的資料從 memory 搬到 register 中;而 store 則是將 1 個 word 的資料從 register 回存到 memory 中。
然而,除了基本資料的搬移外,CPU 也是會從 memory 中載入指令以執行不同的工作,其運作步驟如下:
- CPU 從 memory 中取得所要執行的指令,並將其存放於 instruction register
- CPU 會將此指令拆解成相對應的 CPU 指令集並執行
- 最後將執行結果回存至 memory 中
然而,記憶體中的資料是沒辦法永久儲存的,只要停止供電後就會消失;因此需要其他儲存媒體來協助進行資料的儲存,最常見的當然就是硬碟機 or 光碟片了! 當然還有最近很夯的 USB 隨身碟(屬於 flash memory)。
I/O Structure
OS 中有一大部分是專門處理 I/O 的,原因是因為 I/O 的處理好壞會影響到整體系統的效能 & 穩定度。
I/O 動作再 OS 是按照以下步驟進行的:
- device driver 會先讀取在 device control 中 register 的資訊
- 接著 device controller 會檢視 register 中的內容,判斷所要執行的動作為何 (例如:從鍵盤讀取一個字元)
- device controller 開始從裝置中讀取資料至本地端的緩衝區
- 資料傳輸完畢,device controller 會發送 interrupt 告知 device driver
- 最後 device driver 會將控制權歸還給 OS
- 若是執行的動作為 read,就會傳取得的資料(or 指向資料所在的位置的 pointer);但若執行的是其他動作,則會回傳狀態資訊
看了上面的動作,若是還搞不懂,可以將整個動作想像成:設備要傳遞資料到記憶體中,必須一直發中斷給 CPU,並將資料傳給 CPU 後,由 CPU 把資料放入記憶體中。
顯而易見的,所有資料在傳遞時都必須依賴 CPU 的處理,若是速度很慢的裝置(例如:軟碟機)進行 I/O,就會拖垮整個系統的運作效能。
因此,以上的 I/O 動作在處理量少的資料時還可以,但若是處理量大的資料(例如進行 Disk I/O),就會產生極高的 overhead,而為了解決此問題,就有了 DMA(Direct Memory Access) 的產生,以下有張示意圖:
有了 DMA 之後,device 就可以直接將資料以 block 的方式從本身的緩衝區傳入 memory 中,且不會中斷 CPU 的工作,頂多就是當每個 block 資料傳遞完畢後,發個 interrupt 通知 device driver 動作已經完成。
有些更高階的 OS,使用的是 switch 的機制而非 bus 的架構,在這種 OS 中,不同的元件之間不需要在共用的 bus 上搶奪 cycle,且可以同時相互溝通。
參考資料
- [文章]DMA - Direct Memory Access 直接記憶體存取 [論壇存檔] - 虛空論壇
- 直接記憶體存取(Direct Memory Access)(1)
- 直接記憶體存取 - 維基百科,自由的百科全書