【操作系統】I/O設備

CPU和存儲器不是操作系統惟一需要管理的資源。I/O設備也與操作系統有密切的相互影響。如圖1-6所示,I/O設備一般包括兩個部分:設備控制器和設備本身。控制器是插在電路板上的一塊芯片或一組芯片,這塊電路板物理地控制設備。它從操作系統接收命令,例如,從設備讀數據,並且完成數據的處理。

在許多情形下,對這些設備的控制是非常複雜和具體的,所以,控制器的任務是爲操作系統提供一個簡單的接口(不過還是很複雜的)。例如,磁盤控制器可以接受一個命令從磁盤2讀出11206號扇區,然後,控制器把這個線性扇區號轉化爲柱面、扇區和磁頭。由於外柱面比內柱面有較多的扇區,而且一些壞扇區已經被映射到磁盤的其他地方,所以這種轉換將是很複雜的。磁盤控制器必須確定磁頭臂應該在哪個柱面上,並對磁頭臂發出一串脈衝使其前後移動到所要求的柱面號上,接着必須等待對應的扇區轉動到磁頭下面並開始讀出數據,隨着數據從驅動器讀出,要消去引導塊並計算校驗和。最後,還得把輸入的二進制位組成字並存放到存儲器中。爲了要完成這些工作,在控制器中經常安裝一個小的嵌入式計算機,該嵌入式計算機運行爲執行這些工作而專門編好的程序。

I/O設備的另一個部分是實際設備的自身。設備本身有個相對簡單的接口,這是因爲接口既不能做很多工作,又已經被標準化了。標準化是有必要的,這樣任何一個IDE磁盤控制器就可以適應任一種IDE磁盤,例如,IDE表示集成驅動器電子設備(Integrated Drive Electronics),是許多計算機的磁盤標準。由於實際的設備接口隱藏在控制器中,所以,操作系統看到的是對控制器的接口,這個接口可能和設備接口有很大的差別。

每類設備控制器都是不同的,所以,需要不同的軟件進行控制。專門與控制器對話,發出命令並接收響應的軟件,稱爲設備驅動程序(device driver)。每個控制器廠家必須爲所支持的操作系統提供相應的設備驅動程序。例如,一臺掃描儀會配有用於Windows 2000、Windows XP、Vista以及Linux的設備驅動程序。

爲了能夠使用設備驅動程序,必須把設備驅動程序裝入到操作系統中,這樣它可在覈心態中運行。理論上,設備驅動程序可以在內核外運行,但是幾乎沒有系統支持這種可能的方式,因爲它要求允許在用戶空間的設備驅動程序能夠以控制的方式訪問設備,這是一種極少得到支持的功能。要將設備驅動程序裝入操作系統,有三個途徑。第一個途徑是將內核與設備驅動程序重新鏈接,然後重啓動系統。許多UNIX系統以這種方式工作。第二個途徑是在一個操作系統文件中設置一個入口,並通知該文件需要一個設備驅動程序,然後一個操作系統文件中設置一個入口,並通知該文件需要一個設備驅動程序,然後重啓動系統。在系統啓動時,操作系統去找尋所需的設備驅動程序並裝載之。Windows就是以這種方式工作。第三種途徑是,操作系統能夠在運行時接受新的設備驅動程序並且立即將其安裝好,無須重啓動系統。這種方式採用的較少,但是這種方式正在變得普及起來。熱插拔設備,諸如USB和IEEE1394設備(後面會討論)都需要動態可裝載設備驅動程序。

“每個設備控制器都有少量的用於通信的寄存器。例如,一個最小的磁盤控制器也會有用於指定磁盤地址、內存地址、扇區計數和方向(讀或寫)的寄存器。要激活控制器,設備驅動程序從操作系統獲得一條命令,然後翻譯成對應的值,並寫進設備寄存器中。所有設備寄存器的集合構成了I/O端口空間,我們將在第5章討論有關內容。

在有些計算機中,設備寄存器被映射到操作系統的地址空間(操作系統可使用的地址),這樣,它們就可以像普通存儲字一樣讀出和寫入。在這種計算機中,不需要專門的I/O指令,用戶程序可以被硬件阻擋在外,防止其接觸這些存儲器地址(例如,採用基址和界限寄存器)。在另外一些計算機中,設備寄存器被放入一個專門的I/O端口空間中,每個寄存器都有一個端口地址。在這些機器中,提供在內核態中可使用的專門IN和OUT指令,供設備驅動程序讀寫這些寄存器用。前一種方式不需要專門的I/O指令,但是佔用了一些地址空間。後者不佔用地址空間,但是需要專門的指令。這兩種方式的應用都很廣泛。

實現輸入和輸出的方式有三種。在最簡單的方式中,用戶程序發出一個系統調用,內核將其翻譯成一個對應設備驅動程序的過程調用。然後設備驅動程序啓動I/O並在一個連續不斷的循環中檢查該設備,看該設備是否完成了工作(一般有一些二進制位用來指示設備仍在忙碌中)。當I/O結束後,設備驅動程序把數據送到指定的地方(若有此需要),並返回。然後操作系統將控制返回給調用者。這種方式稱爲忙等待(busy waiting),其缺點是要佔據CPU,CPU一直輪詢設備直到對應的I/O操作完成。

第二種方式是設備驅動程序啓動設備並且讓該設備在操作完成時發出一箇中斷。設備驅動程序在這個時刻返回。操作系統接着在需要時阻塞調用者並安排其他工作進行。當設備驅動程序檢測到該設備的操作完畢時,它發出一箇中斷通知操作完成。

在操作系統中,中斷是非常重要的,所以需要更具體地討論。在圖1-11a中,有一個I/O的三步過程。在第1步,設備驅動程序通過寫設備寄存器通知設備控制器做什麼。然後,設備控制器啓動該設備。當設備控制器傳送完畢被告知的要進行讀寫的字節數量後,它在第2步中使用特定的總線發信號給中斷控制器芯片。如果中斷控制器已經準備接收中斷(如果正忙於一個更高級的中斷,也可能不接收),它會在CPU芯片的一個管腳上聲明,這就是第3步。在第4步中,中斷控制器把該設備的編號放到總線上,這樣CPU可以讀總線,並且知道哪個設備剛剛完成了操作(可能同時有許多設備在運行)。

一旦CPU決定取中斷,通常程序計數器和PSW就被壓入當前堆棧中,並且CPU被切換到用戶態。設備編號可以成爲部分內存的一個引用,用於尋找該設備中斷處理程序的地址。這部分內存稱爲中斷向量(interrupt vector)。當中斷處理程序(中斷設備的設備驅動程序的一部分)開始後,它取走已入棧的程序計數器和PSW,並保存之,然後查詢設備的狀態。在中斷處理程序全部完成之後,它返回到先前運行的用戶程序中尚未執行的頭一條指令。

第三種方式是,爲I/O使用一種特殊的直接存儲器訪問(Direct Memory Access,DMA)芯片,它可以控制在內存和某些控制器之間的位流,而無須持續的CPU干預。CPU對DMA芯片進行設置,說明需要傳送的字節數、有關的設備和內存地址以及操作方向,接着啓動DMA。當DMA芯片完成時,它引發一箇中斷,其處理方式如前所述。有關DMA和I/O硬件會在第5章中具體討論。

中斷經常會在非常不合適的時刻發生,比如,在另一箇中斷程序正在運行時發生。正由於此,CPU有辦法關閉中斷並在稍後再開啓中斷。在中斷關閉時,任何已經發出中斷的設備,可以繼續保持其中斷信號,但是CPU不會被中斷,直至中斷再次啓用爲止。如果在中斷關閉時,已有多個設備發出了中斷,中斷控制器將決定先處理哪個中斷,通常這取決於事先賦予每個設備的靜態優先級。最高優先級的設備贏得競爭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章