操作系統(tǒng)IO簡(jiǎn)介_第1頁(yè)
操作系統(tǒng)IO簡(jiǎn)介_第2頁(yè)
操作系統(tǒng)IO簡(jiǎn)介_第3頁(yè)
操作系統(tǒng)IO簡(jiǎn)介_第4頁(yè)
操作系統(tǒng)IO簡(jiǎn)介_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、設(shè)備又叫做輸入 / 輸出設(shè)備,它是人類用來(lái)和計(jì)算 / 輸出設(shè)備能夠向計(jì)算機(jī)發(fā)送數(shù)據(jù)(輸出)并從計(jì)不同的人對(duì) I/O 硬件的理解也不同。對(duì)于電子工程師而言, I/O 硬件就是 芯片、導(dǎo)線、電源和其他組成硬件的物理設(shè)備。而我們程序員眼中的 I/O 其實(shí) 就是硬件提供給軟件的接口,比如硬件接受到的命令、執(zhí)行的操作以及反饋的 錯(cuò)誤。我們著重探討的是如何對(duì)硬件進(jìn)行編程,而不是其工作原理。 I/O 設(shè)備什么是 I/O 設(shè)備? I/O 機(jī)進(jìn)行通信的外部硬件。輸入 算機(jī)接收數(shù)據(jù)(輸入)??梢苑殖蓛煞N:塊設(shè)備 (block devices) 和字符設(shè)I/O 設(shè)備(I/O devices)備 (character

2、 devices) 。塊設(shè)備 塊設(shè)備是一個(gè)能存儲(chǔ)固定大小塊信息的設(shè)備,它支持以固定大小的塊,扇 區(qū)或群集讀取和(可選)寫入數(shù)據(jù)。每個(gè)塊都有自己的物理地址。通常塊的 大小在 512 - 65536 之間。所有傳輸?shù)男畔⒍紩?huì)以連續(xù)的塊為單位。塊設(shè)備的 基本特征是每個(gè)塊都較為對(duì)立,能夠獨(dú)立的進(jìn)行讀寫。常見的塊設(shè)備有:硬盤、 藍(lán)光光盤、 USB 盤。與字符設(shè)備相比,塊設(shè)備通常需要較少的引腳。 塊設(shè)備的缺點(diǎn)基于給定固態(tài)存儲(chǔ)器的塊設(shè)備比基于相同類型的存儲(chǔ)器的字節(jié)尋址要慢一 些,因?yàn)楸仨氃趬K的開頭開始讀取或?qū)懭?。所以,要讀取該塊的任何部分,必 須尋找到該塊的開始,讀取整個(gè)塊,如果不使用該塊,則將其丟棄。要寫

3、入塊 的一部分,必須尋找到塊的開始,將整個(gè)塊讀入內(nèi)存,修改數(shù)據(jù),再次尋找到 塊的開頭處,然后將整個(gè)塊寫回設(shè)備。字符設(shè)備另一類 I/O 設(shè)備是字符設(shè)備。字符設(shè)備以字符為單位發(fā)送或接收一個(gè)字符 流,而不考慮任何塊結(jié)構(gòu)。字符設(shè)備是不可尋址的,也沒(méi)有任何尋道操作。常 見的字符設(shè)備有 打印機(jī)、網(wǎng)絡(luò)設(shè)備、鼠標(biāo)、以及大多數(shù)與磁盤不同的設(shè)備。 下面顯示了一些常見設(shè)備的數(shù)據(jù)速率。Device設(shè)備Data rate10 bytes/sec100 bytes/sec7 KB/secI 描儀 1 MB/sec4x Blu-ray disc 4倍g光光盤18 M B/secKeyboard 鍵SMouse鼠標(biāo)56 K

4、modem 56K調(diào)制解調(diào)器Scanner at 300 dpi 300dpiDigital camcord字便攜貳擁像tfl3.5 MB/sec802JIn Wireless802,iin 無(wú)戎 37.5 MB/secUSB 2.0FireWire 800 火線 800 Gigabit Ethernet干兆以太網(wǎng)60 M B/sec100 MB/sec 125MB/sd SATA 3 disk drive satas磁盤騎血 MB/sec625 MB/sec5 翻at MB/sec985 M B/sec2.5 GB/sec5 G B/secElUSB 3j0SCSI Ultra 5 bus

5、SCSI Ultra Single-lane PCIe 3.0 bus Thunderbolt 2 bus 2 總線 SONET OC-768 network設(shè)備控制器首先需要先了解一下設(shè)備控制器的概念。設(shè)備控制器是處理CPU傳入和傳出信號(hào)的系統(tǒng)。設(shè)備通過(guò)插頭和插座連接 到計(jì)算機(jī),并且插座連接到設(shè)備控制器。設(shè)備控制器從連接的設(shè)備處接收數(shù)據(jù), 并將其存儲(chǔ)在控制器內(nèi)部的一些特殊目的寄存器(sp ecial purpose registers)也就是本地緩沖區(qū)中。特殊用途寄存器,顧名思義是僅為一項(xiàng)任務(wù)而設(shè)計(jì)的寄存器。例如, cs, ds,gs和其他段寄存器屬于特殊目的寄存器,因?yàn)樗鼈兊拇嬖谑菫榱吮4?/p>

6、段號(hào)。 eax,ecx等是一般用途的寄存器,因?yàn)槟憧梢詿o(wú)限制地使用它們。例如,你不 能移動(dòng)ds,但是可以移動(dòng)eax,ebx。eax、ecx、edx、ebx、esics、ds、ss、es、fs通用目的寄存器比如有:eax、ecx、edx、ebx、esi、edi、ebp、esp特殊目的寄存器比如有:cs、ds、ss、es、fs、gs、eip、flag每個(gè)設(shè)備控制器都會(huì)有一個(gè)應(yīng)用程序與之對(duì)應(yīng),設(shè)備控制器通過(guò)應(yīng)用程序 的接口通過(guò)中斷與操作系統(tǒng)進(jìn)行通信。設(shè)備控制器是硬件,而設(shè)備驅(qū)動(dòng)程序是 軟件。I/O 設(shè)備通常由機(jī)械組件(mechanical component)和電子組件(electronic com

7、ponent)構(gòu)成。電子組件被稱為設(shè)備控制器(device con troller)或者適配器(adapter)。在個(gè)人計(jì)算機(jī)上,它通常采用可插入(PCle)擴(kuò)展插槽的主板上的 芯片或印刷電路卡的形式。PCIeiipcteiaw機(jī)械設(shè)備就是它自己,它的組成如下CPU存儲(chǔ)器Ml視頻控制器總蛀S卑個(gè)人計(jì)機(jī)酌遜埠控制器卡上通常會(huì)有一個(gè)連接器,通向設(shè)備本身的電纜可以插入到這個(gè)連 接器中,很多控制器可以操作2個(gè)、4個(gè)設(shè)置8個(gè)相同的設(shè)備。控制器與設(shè)備之間的接口通常是一個(gè)低層次的接口。例如,磁盤可能被格 式化為2,000,000 個(gè)扇區(qū),每個(gè)磁道512字節(jié)。然而,實(shí)際從驅(qū)動(dòng)出來(lái)的卻 是一個(gè)串行的比特流,從一

8、個(gè)前導(dǎo)符(preamble)開始,然后是一個(gè)扇區(qū)中的 4096位,最后是一個(gè)校驗(yàn)和或 ECC(錯(cuò)誤碼,Error-Correct ing Code )。前 導(dǎo)符是在對(duì)磁盤進(jìn)行格式化的時(shí)候?qū)懮先サ模ㄖ鏀?shù)和扇區(qū)號(hào),扇區(qū)大 小以及類似的數(shù)據(jù),此外還包含同步信息??刂破鞯娜蝿?wù)是把串行的位流轉(zhuǎn)換為字節(jié)塊,并進(jìn)行必要的錯(cuò)誤校正工作。 字節(jié)塊通常會(huì)在控制器內(nèi)部的一個(gè)緩沖區(qū)按位進(jìn)行組裝,然后再對(duì)校驗(yàn)和進(jìn)行 校驗(yàn)并證明字節(jié)塊沒(méi)有錯(cuò)誤后,再將它復(fù)制到內(nèi)存中。內(nèi)存映射I/O每個(gè)控制器都會(huì)有幾個(gè)寄存器用來(lái)和 CPU進(jìn)行通信。通過(guò)寫入這些寄存器, 操作系統(tǒng)可以命令設(shè)備發(fā)送數(shù)據(jù),接收數(shù)據(jù)、開啟或者關(guān)閉設(shè)備等。通過(guò)

9、從這 些寄存器中讀取信息,操作系統(tǒng)能夠知道設(shè)備的狀態(tài),是否準(zhǔn)備接受一個(gè)新命 令等。為了控制寄存器,許多設(shè)備都會(huì)有數(shù)據(jù)緩沖區(qū)(data buffer),來(lái)供系統(tǒng)進(jìn) 行讀寫。例如,在屏幕上顯示一個(gè)像素的常規(guī)方法是使用一個(gè)視頻 RAM這一 RAM基本上只是一個(gè)數(shù)據(jù)緩沖區(qū),用來(lái)供程序和操作系統(tǒng)寫入數(shù)據(jù)。那么問(wèn)題來(lái)了,CPU如何與設(shè)備寄存器和設(shè)備數(shù)據(jù)緩沖區(qū)進(jìn)行通信呢?存 在兩個(gè)可選的方式。第一種方法是,每個(gè)控制寄存器都被分配一個(gè)I/O端口(I/O port) 號(hào),這是一個(gè)8位或16位的整數(shù)。所有I/O 端口的集合形成了 受保護(hù)的I/O 端口空間,以便普通用戶程序無(wú)法訪問(wèn)它(只有操作系統(tǒng)可以訪 問(wèn))。使用

10、特殊的I/O 指令像是IN REG ,P ORTCPU可以讀取控制寄存器 P ORT的內(nèi)容并將結(jié)果放在 CPU寄存器REG中。 類似的,使用OUT P ORT,REGCPU可以將REG的內(nèi)容寫到控制寄存器中。大多數(shù)早期計(jì)算機(jī),包括幾乎 所有大型主機(jī),如IBM 360及其所有后續(xù)機(jī)型,都是以這種方式工作的??刂萍拇嫫魇且粋€(gè)處理器寄存器而改變或控制的一般行為CPU或其他數(shù)字設(shè)備。控制寄存器執(zhí)行的常見任務(wù)包括中斷控制,切換尋址模式,分頁(yè)控制和 協(xié)處理器控制。在這一方案中,內(nèi)存地址空間和I/O 地址空間是不相同的,如下圖所示兩個(gè)地址空間OxFFFF1旳端口指令I(lǐng)N R0,4和MOV R0,4這一設(shè)計(jì)中

11、完全不同。前者讀取 I/O 端口 4的內(nèi)容并將其放入 R0 , 而后者讀取存儲(chǔ)器字4的內(nèi)容并將其放入 R0。這些示例中的4代表不同且不相關(guān)的地址空間。它將所有控制寄存器映射到內(nèi)存空間中,如下圖所示-個(gè)地址空間內(nèi)存映射的I/O是在CPU與其連接的外圍設(shè)備之間交換數(shù)據(jù)和指令的一 種方式,這種方式是處理器和IO設(shè)備共享同一內(nèi)存位置的內(nèi)存,即處理器和 IO設(shè)備使用內(nèi)存地址進(jìn)行映射。在大多數(shù)系統(tǒng)中,分配給控制寄存器的地址位于或者靠近地址的頂部附近。 下面是采用的一種混合方式兩個(gè)地址空間這種方式具有與內(nèi)存映射I/O 的數(shù)據(jù)緩沖區(qū),而控制寄存器則具有單獨(dú)的 I/O端口。x86采用這一體系結(jié)構(gòu)。在IBM PC

12、兼容機(jī)中,除了 0到64K - 1 的I/O 端口之外,640 K到1M - 1的內(nèi)存地址保留給設(shè)備的數(shù)據(jù)緩沖區(qū)。這些方案是如何工作的呢?當(dāng) CPU想要讀入一個(gè)字的時(shí)候,無(wú)論是從內(nèi)存 中讀入還是從I/O 端口讀入,它都要將需要的地址放到總線地址線上,然后在 總線的一條控制線上調(diào)用一個(gè)READ信號(hào)。還有第二條信號(hào)線來(lái)表明需要的是I/O 空間還是內(nèi)存空間。如果是內(nèi)存空間,內(nèi)存將響應(yīng)請(qǐng)求。如果是 I/O 空間,那么I/O 設(shè)備將響應(yīng)請(qǐng)求。如果只有內(nèi)存空間,那么每個(gè)內(nèi)存模塊和每 個(gè)I/O 設(shè)備都會(huì)將地址線和它所服務(wù)的地址范圍進(jìn)行比較。如果地址落在這一 范圍之內(nèi),它就會(huì)響應(yīng)請(qǐng)求。絕對(duì)不會(huì)出現(xiàn)地址既分配給

13、內(nèi)存又分配給I/O 設(shè)備,所以不會(huì)存在歧義和沖突。內(nèi)存映射I/O的優(yōu)點(diǎn)和缺點(diǎn)這兩種尋址控制器的方案具有不同的優(yōu)缺點(diǎn)。先來(lái)看一下內(nèi)存映射I/O 的優(yōu)點(diǎn)。?第一,如果需要特殊的I/O 指令讀寫設(shè)備控制寄存器,那么訪問(wèn)這些寄存器需 要使用匯編代碼,因?yàn)樵?C或C+中不存在執(zhí)行IN和OUT指令的方法。調(diào)用 這樣的過(guò)程增加了 I/O的開銷。在內(nèi)存映射中,控制寄存器只是內(nèi)存中的變量, 在C語(yǔ)言中可以和其他變量一樣進(jìn)行尋址。?第二,對(duì)于內(nèi)存映射I/O ,不需要特殊的保護(hù)機(jī)制就能夠阻止用戶進(jìn)程執(zhí)行 I/O操作。操作系統(tǒng)需要保證的是禁止把控制寄存器的地址空間放在用戶的虛 擬地址中就可以了。?第三,對(duì)于內(nèi)存映射I

14、/O,可以引用內(nèi)存的每一條指令也可以引用控制寄存器, 便于引用。在計(jì)算機(jī)設(shè)計(jì)中,幾乎所有的事情都要權(quán)衡。內(nèi)存映射I/O 也是一樣,它也有自己的缺點(diǎn)。首先,大部分計(jì)算機(jī)現(xiàn)在都會(huì)有一些對(duì)于內(nèi)存字的緩存。緩 存一個(gè)設(shè)備控制寄存器的代價(jià)是很大的。為了避免這種內(nèi)存映射I/O的情況,硬件必須有選擇性的禁用緩存,例如,在每個(gè)頁(yè)面上禁用緩存,這個(gè)功能為硬 件和操作系統(tǒng)增加了額外的復(fù)雜性,因此必須選擇性的進(jìn)行管理。第二點(diǎn),如果僅僅只有一個(gè)地址空間,那么所有的內(nèi)存模塊(memorymodules)和所有的I/O 設(shè)備都必須檢查所有的內(nèi)存引用來(lái)推斷出誰(shuí)來(lái)進(jìn)行響應(yīng)。 什么是內(nèi)存模塊?在計(jì)算中,存儲(chǔ)器模塊是其上安裝有存

15、儲(chǔ)器集成電路的印刷 電路板。如果計(jì)算機(jī)是一種單總線體系結(jié)構(gòu)的話,如下圖所示所有的內(nèi)存和 ro向此址單總線體系結(jié)構(gòu)讓每個(gè)內(nèi)存模塊和I/O設(shè)備查看每個(gè)地址是簡(jiǎn)單易行的。然而,現(xiàn)代個(gè)人計(jì)算機(jī)的趨勢(shì)是專用的高速內(nèi)存總線,如下圖所示CPU讀寫內(nèi)存會(huì)轉(zhuǎn)到 離速帶寬總線 總線GPU所有的內(nèi)存和170地址走向此處裝備這一總線是為了優(yōu)化內(nèi)存訪問(wèn)速度,x86系統(tǒng)還可以有多種總線(內(nèi) 存、P Cle、SCSI和USB)。如下圖所示一亍弋申肺X36至汽暫皓鉤在內(nèi)存映射機(jī)器上使用單獨(dú)的內(nèi)存總線的麻煩之處在于,I/O設(shè)備無(wú)法通過(guò)內(nèi)存總線查看內(nèi)存地址,因此它們無(wú)法對(duì)其進(jìn)行響應(yīng)。此外,必須采取特殊 的措施使內(nèi)存映射I/O工作

16、在具有多總線的系統(tǒng)上。一種可能的方法是首先將 全部?jī)?nèi)存引用發(fā)送到內(nèi)存,如果內(nèi)存響應(yīng)失敗,CPU再嘗試其他總線。第二種設(shè)計(jì)是在內(nèi)存總線上放一個(gè)探查設(shè)備,放過(guò)所有潛在指向所關(guān)注的 I/O設(shè)備的地址。此處的問(wèn)題是,I/O設(shè)備可能無(wú)法以內(nèi)存所能達(dá)到的速度處 理請(qǐng)求。第三種可能的設(shè)計(jì)是在內(nèi)存控制器中對(duì)地址進(jìn)行過(guò)濾,這種設(shè)計(jì)與上圖所 描述的設(shè)計(jì)相匹配。這種情況下,內(nèi)存控制器芯片中包含在引導(dǎo)時(shí)預(yù)裝載的范 圍寄存器。這一設(shè)計(jì)的缺點(diǎn)是需要在引導(dǎo)時(shí)判定哪些內(nèi)存地址而不是真正的內(nèi) 存地址。因而,每一設(shè)計(jì)都有支持它和反對(duì)它的論據(jù),所以折中和權(quán)衡是不可 避免的。直接內(nèi)存訪問(wèn)CPU通過(guò)單一的系統(tǒng)總線訪問(wèn)所有的設(shè) I/O設(shè)

17、備,如下圖所示DMA控制器詰盤控制器CPU4.匕 DMA1L CPU 對(duì) DMAiIllL無(wú)論一個(gè)CPU是否具有內(nèi)存映射I/O,它都需要尋址設(shè)備控制器以便與它 們交換數(shù)據(jù)。CPU可以從I/O 控制器每次請(qǐng)求一個(gè)字節(jié)的數(shù)據(jù),但是這么做會(huì) 浪費(fèi)CPU時(shí)間,所以經(jīng)常會(huì)用到一種稱為直接內(nèi)存訪問(wèn) (Direct Memory Access)的方案。為了簡(jiǎn)化,我們假設(shè) 備和內(nèi)存,該總線連接CPU、內(nèi)存和內(nèi)存DMA傳送操作 現(xiàn)代操作系統(tǒng)實(shí)際更為復(fù)雜,但是原理是相同的。如果硬件有DMA控制器,那么操作系統(tǒng)只能使用DMA有時(shí)這個(gè)控制器會(huì)集成到磁盤控制器和其他控制 器中,但這種設(shè)計(jì)需要在每個(gè)設(shè)備上都裝有一個(gè)分離的

18、DMA控制器。單個(gè)的DMA控制器可用于向多個(gè)設(shè)備傳輸,這種傳輸往往同時(shí)進(jìn)行。不管DMA控制器的物理地址在哪,它都能夠獨(dú)立于 CPU從而訪問(wèn)系統(tǒng)總 線,如上圖所示。它包含幾個(gè)可由 CPU讀寫的寄存器,其中包括一個(gè)內(nèi)存地址 寄存器,字節(jié)計(jì)數(shù)寄存器和一個(gè)或多個(gè)控制寄存器??刂萍拇嫫髦付ㄒ褂玫?I/O 端口、傳送方向(從 I/O 設(shè)備讀或?qū)懙絀/O 設(shè)備)、傳送單位(每 次一個(gè)字節(jié)或者每次一個(gè)字)以及在一次突發(fā)傳送中要傳送的字節(jié)數(shù)。為了解釋DMA的工作原理,我們首先看一下不使用 DMA該如何進(jìn)行磁盤 讀取。?首先,控制器從磁盤驅(qū)動(dòng)器串行地、一位一位的讀一個(gè)塊(一個(gè)或多個(gè)扇區(qū)), 直到將整塊信息放入控

19、制器的內(nèi)部緩沖區(qū)。?讀取校驗(yàn)和以保證沒(méi)有發(fā)生讀錯(cuò)誤。然后控制器會(huì)產(chǎn)生一個(gè)中斷,當(dāng)操作系統(tǒng) 開始運(yùn)行時(shí),它會(huì)重復(fù)的從控制器的緩沖區(qū)中一次一個(gè)字節(jié)或者一個(gè)字地讀取 該塊的信息,并將其存入內(nèi)存中。DMA工作原理當(dāng)使用DMA后,這個(gè)過(guò)程就會(huì)變得不一樣了。首先 CPU通過(guò)設(shè)置DMA控 制器的寄存器對(duì)它進(jìn)行編程,所以 DMA控制器知道將什么數(shù)據(jù)傳送到什么地方。 DMA控制器還要向磁盤控制器發(fā)出一個(gè)命令,通知它從磁盤讀數(shù)據(jù)到其內(nèi)部的 緩沖區(qū)并檢驗(yàn)校驗(yàn)和。當(dāng)有效數(shù)據(jù)位于磁盤控制器的緩沖區(qū)中時(shí),DMA就可以開始了。DMA控制器通過(guò)在總線上發(fā)出一個(gè)讀請(qǐng)求到磁盤控制器而發(fā)起DMA傳送,這是第二步。這個(gè)讀請(qǐng)求就像其他

20、讀請(qǐng)求一樣,磁盤控制器并不知道或者并不 關(guān)心它是來(lái)自CPU還是來(lái)自DMA控制器。通常情況下,要寫的內(nèi)存地址在總 線的地址線上,所以當(dāng)磁盤控制器去匹配下一個(gè)字時(shí),它知道將該字寫到什么 地方。寫到內(nèi)存就是另外一個(gè)總線循環(huán)了,這是第三步。當(dāng)寫操作完成時(shí),磁 盤控制器在總線上發(fā)出一個(gè)應(yīng)答信號(hào)到 DMA 控制器,這是第四步。然后,DMA控制器會(huì)增加內(nèi)存地址并減少字節(jié)數(shù)量。如果字節(jié)數(shù)量仍然大 于0,就會(huì)循環(huán)步驟2 -步驟4 ,直到字節(jié)計(jì)數(shù)變?yōu)?。此時(shí),DMAg制 器會(huì)打斷 CPU 并告訴它傳輸已經(jīng)完成了。操作系統(tǒng)開始運(yùn)行時(shí),它不會(huì)把磁盤 塊拷貝到內(nèi)存中,因?yàn)樗呀?jīng)在內(nèi)存中了。不同 DMA 控制器的復(fù)雜程度

21、差別很大。最簡(jiǎn)單的 DMA 控制器每次處理一 次傳輸,就像上面描述的那樣。更為復(fù)雜的情況是一次同時(shí)處理很多次傳輸, 這樣的控制器內(nèi)部具有多組寄存器,每個(gè)通道一組寄存器。在傳輸每一個(gè)字之 后,DMA控制器就決定下一次要為哪個(gè)設(shè)備提供服務(wù)。DMAg制器可能被設(shè)置 為使用 輪詢算法,或者它也有可能具有一個(gè)優(yōu)先級(jí)規(guī)劃設(shè)計(jì),以便讓某些設(shè) 備受到比其他設(shè)備更多的照顧。假如存在一個(gè)明確的方法分辨應(yīng)答信號(hào),那么 在同一時(shí)間就可以掛起對(duì)不同設(shè)備控制器的多個(gè)請(qǐng)求。許多總線能夠以兩種模式操作:每次一字模式和塊模式。一些DMA 控制器也能夠使用這兩種方式進(jìn)行操作。在前一個(gè)模式中,DMAg制器請(qǐng)求傳送一個(gè)字并得到這個(gè)字

22、。如果 CPU 想要使用總線,它必須進(jìn)行等待。設(shè)備可能會(huì)偷 偷進(jìn)入并且從CPU偷走一個(gè)總線周期,從而輕微的延遲 CPU這種機(jī)制稱 為 周期竊取 (cycle stealing)。在塊模式中,DMA控制器告訴設(shè)備獲取總線,然后進(jìn)行一系列的傳輸操作, 然后釋放總線。這一操作的形式稱為突發(fā)模式(burst mode)。這種模式要比周期竊取更有效因?yàn)楂@取總線占用了時(shí)間,并且一次總線獲得的代價(jià)是可以同 時(shí)傳輸多個(gè)字。缺點(diǎn)是如果此時(shí)進(jìn)行的是長(zhǎng)時(shí)間的突發(fā)傳送,有可能將 CPU 和 其他設(shè)備阻塞很長(zhǎng)的時(shí)間。在我們討論的這種模型中,有時(shí)被稱為飛越模式 (fly-by mode) ,DMA控制 器會(huì)告訴設(shè)備控制器

23、把數(shù)據(jù)直接傳遞到內(nèi)存。一些 DMA 控制器使用的另一種模 式是讓設(shè)備控制器將字發(fā)送給 DMA 控制器,然后 DMA 控制器發(fā)出第二條總線 請(qǐng)求,將字寫到任何可以寫入的地方。采用這種方案,每個(gè)傳輸?shù)淖侄夹枰?個(gè)額外的總線周期,但是更加靈活,因?yàn)樗€可以執(zhí)行設(shè)備到設(shè)備的復(fù)制,甚 至是內(nèi)存到內(nèi)存的復(fù)制(通過(guò)事先對(duì)內(nèi)存進(jìn)行讀取,然后對(duì)內(nèi)存進(jìn)行寫入)。 大部分的 DMA 控制器使用物理地址進(jìn)行傳輸。使用物理地址需要操作系統(tǒng)將目 標(biāo)內(nèi)存緩沖區(qū)的虛擬地址轉(zhuǎn)換為物理地址,并將該物理地址寫入DMA 控制器的地址寄存器中。另一種方案是一些 DMA 控制器將虛擬地址寫入 DMA 控制器中。 然后,DMA控制器必須

24、使用MMU才能完成虛擬到物理的轉(zhuǎn)換。僅當(dāng) MMU是內(nèi) 存的一部分而不是 CPU 的一部分時(shí),才可以將虛擬地址放在總線上。重溫中斷在一臺(tái)個(gè)人計(jì)算機(jī)體系結(jié)構(gòu)中,中斷結(jié)構(gòu)會(huì)如下所示中斷控制器CPU設(shè)備完成工作1. Device is finished Keyboard3. CPU RE中2L揑制flift匱中ft-Printer中斷是怎樣發(fā)生的當(dāng)一個(gè)I/O 設(shè)備完成它的工作后,它就會(huì)產(chǎn)生一個(gè)中斷(默認(rèn)操作系統(tǒng)已 經(jīng)開啟中斷),它通過(guò)在總線上聲明已分配的信號(hào)來(lái)實(shí)現(xiàn)此目的。主板上的中 斷控制器芯片會(huì)檢測(cè)到這個(gè)信號(hào),然后執(zhí)行中斷操作。如果在中斷前沒(méi)有其他中斷操作阻塞的話,中斷控制器將立刻對(duì)中斷進(jìn)行 處理,

25、如果在中斷前還有其他中斷操作正在執(zhí)行,或者有其他設(shè)備發(fā)出級(jí)別更 高的中斷信號(hào)的話,那么這個(gè)設(shè)備將暫時(shí)不會(huì)處理。在這種情況下,該設(shè)備會(huì) 繼續(xù)在總線上置起中斷信號(hào),直到得到 CPU服務(wù)。為了處理中斷,中斷控制器在地址線上放置一個(gè)數(shù)字,指定要關(guān)注的設(shè)備 是哪個(gè),并聲明一個(gè)信號(hào)以中斷 CPU。中斷信號(hào)導(dǎo)致CPU停止當(dāng)前正在做的工 作并且開始做其他事情。地址線上會(huì)有一個(gè)指向中斷向量表的索引,用來(lái)獲取 下一個(gè)程序計(jì)數(shù)器。這個(gè)新獲取的程序計(jì)數(shù)器也就表示著程序?qū)⒁_始,它會(huì) 指向程序的開始處。一般情況下,陷阱和中斷從這一點(diǎn)上看使用相同的機(jī)制, 并且常常共享相同的中斷向量。中斷向量的位置可以硬連線到機(jī)器中,也可

26、以 位于內(nèi)存中的任何位置,由CPU寄存器指向其起點(diǎn)。中斷服務(wù)程序開始運(yùn)行后,中斷服務(wù)程序通過(guò)將某個(gè)值寫入中斷控制器的 I/O端口來(lái)確認(rèn)中斷。告訴它中斷控制器可以自由地發(fā)出另一個(gè)中斷。通過(guò)讓 CPU延遲響應(yīng)來(lái)達(dá)到多個(gè)中斷同時(shí)到達(dá) CPU涉及到競(jìng)爭(zhēng)的情況發(fā)生。一些老的 計(jì)算機(jī)沒(méi)有集中的中斷控制器,通常每個(gè)設(shè)備請(qǐng)求自己的中斷。硬件通常在服務(wù)程序開始前保存當(dāng)前信息。對(duì)于不同的CPU來(lái)說(shuō),哪些信息需要保存以及保存在哪里差別很大。不管其他的信息是否保存,程序計(jì)數(shù)器 必須要被保存,這對(duì)所有的 CPU來(lái)說(shuō)都是相同的,以此來(lái)恢復(fù)中斷的進(jìn)程。所 有可見寄存器和大量?jī)?nèi)部寄存器也應(yīng)該被保存。上面說(shuō)到硬件應(yīng)該保存當(dāng)前信

27、息,那么保存在哪里是個(gè)問(wèn)題,一種選擇是 將其放入到內(nèi)部寄存器中,在需要時(shí)操作系統(tǒng)可以讀出這些內(nèi)部寄存器。這種 方法會(huì)造成的問(wèn)題是:一段時(shí)間內(nèi)設(shè)備無(wú)法響應(yīng),直到所有的內(nèi)部寄存器中存 儲(chǔ)的信息被讀出后,才能恢復(fù)運(yùn)行,以免第二個(gè)內(nèi)部寄存器重寫內(nèi)部寄存器的 狀態(tài)。第二種方式是在堆棧中保存信息,這也是大部分CPU所使用的方式。但是,這種方法也存在問(wèn)題,因?yàn)槭褂玫亩褩2淮_定,如果使用的是當(dāng)前堆棧,則它 很可能是用戶進(jìn)程的堆棧。堆棧指針甚至不合法,這樣當(dāng)硬件試圖在它所指的 地址處寫入時(shí),將會(huì)導(dǎo)致致命錯(cuò)誤。如果使用的是內(nèi)核堆棧,堆棧指針是合法的并且指向一個(gè)固定的頁(yè)面,這樣的機(jī)會(huì)可能會(huì)更大。然而,切換到內(nèi)核態(tài)需

28、 要切換MMU上下文,并且可能使高速緩存或者 TLB失效。靜態(tài)或動(dòng)態(tài)重新裝 載這些東西將增加中斷處理的時(shí)間,浪費(fèi) CPU時(shí)間。精確中斷和不精確中斷另一個(gè)問(wèn)題是:現(xiàn)代CPU大量的采用流水線并且有時(shí)還采用超標(biāo)量(內(nèi)部 并行)。在一些老的系統(tǒng)中,每條指令執(zhí)行完畢后,微程序或硬件將檢查是否存 在未完成的中斷。如果存在,那么程序計(jì)數(shù)器和 PSW將被壓入堆棧中開始中斷 序列。在中斷程序運(yùn)行之后,舊的 PSW和程序計(jì)數(shù)器將從堆棧中彈出恢復(fù)先前 的進(jìn)程。下面是一個(gè)流水線模型未執(zhí)行332未執(zhí)行328未執(zhí)行324320PC未執(zhí)行316完全執(zhí)行312完全執(zhí)行完全執(zhí)行308完全執(zhí)行304300在流水線滿的時(shí)候出現(xiàn)一個(gè)

29、中斷會(huì)發(fā)生什么情況?許多指令正處于不同的 執(zhí)行階段,中斷出現(xiàn)時(shí),程序計(jì)數(shù)器的值可能無(wú)法正確地反應(yīng)已經(jīng)執(zhí)行過(guò)的指 令和尚未執(zhí)行的指令的邊界。事實(shí)上,許多指令可能部分執(zhí)行,不同的指令完 成的程度或多或少。在這種情況下,a程序計(jì)數(shù)器更有可能反應(yīng)的是將要被取 出并壓入流水線的下一條指令的地址,而不是剛剛被執(zhí)行單元處理過(guò)的指令的 地址。在超標(biāo)量的設(shè)計(jì)中,可能更加糟糕3323233243203ie312308304300每個(gè)指令都可以分解成為微操作,微操作有可能亂序執(zhí)行,這取決于內(nèi)部 資源(如功能單元和寄存器)的可用性。當(dāng)中斷發(fā)生時(shí),某些很久以前啟動(dòng)的 指令可能還沒(méi)開始執(zhí)行,而最近執(zhí)行的指令可能將要馬上完

30、成。在中斷信號(hào)出 現(xiàn)時(shí),可能存在許多指令處于不同的完成狀態(tài),它們與程序計(jì)數(shù)器之間沒(méi)有什 么關(guān)系。這樣的中使機(jī)器處于良好狀態(tài)的中斷稱為精確中斷(P recise in terru pt)斷具有四個(gè)屬性:? PC (程序計(jì)數(shù)器)保存在一個(gè)已知的地方? PC所指向的指令之前所有的指令已經(jīng)完全執(zhí)行? PC所指向的指令之后所有的指令都沒(méi)有執(zhí)行? PC所指向的指令的執(zhí)行狀態(tài)是已知的,不精確中不滿足以上要求的中斷稱為不精確中斷 (im precise in terru pt)斷讓人很頭疼。上圖描述了不精確中斷的現(xiàn)象。指令的執(zhí)行時(shí)序和完成度具有 不確定性,而且恢復(fù)起來(lái)也非常麻煩。10軟件原理I/O軟件目標(biāo)設(shè)備

31、獨(dú)立性現(xiàn)在讓我們轉(zhuǎn)向?qū)/O 軟件的研究,I/O軟件設(shè)計(jì)一個(gè)很重要的目標(biāo)就是 設(shè)備獨(dú)立性(device in de pen de nee)。啥意思呢?這意味著我們能夠編寫訪問(wèn) 任何設(shè)備的應(yīng)用程序,而不用事先指定特定的設(shè)備。比如你編寫了一個(gè)能夠 從設(shè)備讀入文件的應(yīng)用程序,那么這個(gè)應(yīng)用程序可以從硬盤、DVD或者USB進(jìn)行讀入,不必再為每個(gè)設(shè)備定制應(yīng)用程序。這其實(shí)就體現(xiàn)了設(shè)備獨(dú)立性的概念。DVD再比如說(shuō)你可以輸入一條下面的指令sort輸入輸出那么上面這個(gè)輸入就可以接收來(lái)自任意類型的磁盤或者鍵盤,并且輸出可 以寫入到任意類型的磁盤或者屏幕。rr1輸入備出1r1破盤LJLJ輸入I計(jì)算機(jī)操作系統(tǒng)是這些硬件

32、的媒介,因?yàn)椴煌布鼈兊闹噶钚蛄胁煌?所以需要操作系統(tǒng)來(lái)做指令間的轉(zhuǎn)換。與設(shè)備獨(dú)立性密切相關(guān)的一個(gè)指標(biāo)就是統(tǒng)一命名(u niform n ami ng)。設(shè)備的代號(hào)應(yīng)該是一個(gè)整數(shù)或者是字符串,它們不應(yīng)該依賴于具體的設(shè)備。在UNIX中,所有的磁盤都能夠被集成到文件系統(tǒng)中,所以用戶不用記住每個(gè)設(shè)備的具 體名稱,直接記住對(duì)應(yīng)的路徑即可,如果路徑記不住,也可以通過(guò)Is等指令找到具體的集成位置。舉個(gè)例子來(lái)說(shuō),比如一個(gè)USB磁盤被掛載到了/usr/cxuan/backup 下,那么你把文件復(fù)制至U /usr/cxuan/backup/device下,就相當(dāng)于是把文件復(fù)制到了磁盤中,通過(guò)這種方式,實(shí)現(xiàn)了

33、向任何磁盤寫入文 件都相當(dāng)于是向指定的路徑輸出文件。錯(cuò)誤處理除了設(shè)備獨(dú)立性外,I/O軟件實(shí)現(xiàn)的第二個(gè)重要的目標(biāo)就是錯(cuò)誤處理(error han dli ng)。通常情況下來(lái)說(shuō),錯(cuò)誤應(yīng)該交給硬件層面去處理。如果設(shè) 備控制器發(fā)現(xiàn)了讀錯(cuò)誤的話,它會(huì)盡可能的去修復(fù)這個(gè)錯(cuò)誤。如果設(shè)備控制器 處理不了這個(gè)問(wèn)題,那么設(shè)備驅(qū)動(dòng)程序應(yīng)該進(jìn)行處理,設(shè)備驅(qū)動(dòng)程序會(huì)再次嘗 試讀取操作,很多錯(cuò)誤都是偶然性的,如果設(shè)備驅(qū)動(dòng)程序無(wú)法處理這個(gè)錯(cuò)誤, 才會(huì)把錯(cuò)誤向上拋到硬件層面(上層)進(jìn)行處理,很多時(shí)候,上層并不需要知 道下層是如何解決錯(cuò)誤的。這就很像項(xiàng)目經(jīng)理不用把每個(gè)決定都告訴老板;程 序員不用把每行代碼如何寫告訴項(xiàng)目經(jīng)理。

34、這種處理方式不夠透明。同步和異步傳輸I/O 軟件實(shí)現(xiàn)的第三個(gè)目標(biāo)就是同步 (synchronous)和異步(asynchronous, 即中斷驅(qū)動(dòng))傳輸。這里先說(shuō)一下同步和異步是怎么回事吧。同步傳輸中數(shù)據(jù)通常以塊或幀的形式發(fā)送。發(fā)送方和接收方在數(shù)據(jù)傳輸之 前應(yīng)該具有同步時(shí)鐘。而在異步傳輸中,數(shù)據(jù)通常以字節(jié)或者字符的形式發(fā)送, 異步傳輸則不需要同步時(shí)鐘,但是會(huì)在傳輸之前向數(shù)據(jù)添加奇偶校驗(yàn)位。下面 是同步和異步的主要區(qū)別比較條件同涉?zhèn)髁漠惒轿驂K圣序列幵始它分劇在字荷貳面和后面便用幵始?xì)趾屯M?僅B傳的t式以塊或幀的昭式發(fā)送數(shù)據(jù)岌送宇節(jié)或者宇苻同毎方式同母時(shí)鐘無(wú)傳錨逋率同桂傳諒比較快畀歩傳揣比較慢匹

35、闔閘隔同步傳輸a常是恒疋眄闔異步傳輸叫畫酗機(jī)幵銷同歩開銷比較昂貴異步傳輔幵銷比較小是否存在閭不存在行在實(shí)現(xiàn)硬件和欽件只有醸件聊天室,視碩會(huì)1(電話對(duì)話信件,電子郵件,論壇大部分物理10(physical I/O)是異步的。物理I/O 中的CPU回到正題。是很聰明的,CPU傳輸完成后會(huì)轉(zhuǎn)而做其他事情,它和中斷心靈相通,等到中 斷發(fā)生后,CPU才會(huì)回到傳輸這件事情上來(lái)。I/O分為兩種:物理I/O和邏輯l/O(Logical I/O) 。物理I/O 通常是從磁盤等存儲(chǔ)設(shè)備實(shí)際獲取數(shù)據(jù)。邏輯I/O 是對(duì)存儲(chǔ)器(塊,緩沖區(qū))獲取數(shù)據(jù)。緩沖I/O軟件的最后一個(gè)問(wèn)題是緩沖(buffering)。通常情況下,

36、從一個(gè)設(shè)備發(fā) 出的數(shù)據(jù)不會(huì)直接到達(dá)最后的設(shè)備。其間會(huì)經(jīng)過(guò)一系列的校驗(yàn)、檢查、緩沖等 操作才能到達(dá)。舉個(gè)例子來(lái)說(shuō),從網(wǎng)絡(luò)上發(fā)送一個(gè)數(shù)據(jù)包,會(huì)經(jīng)過(guò)一系列檢查 之后首先到達(dá)緩沖區(qū),從而消除緩沖區(qū)填滿速率和緩沖區(qū)過(guò)載。共享和獨(dú)占I/O軟件引起的最后一個(gè)問(wèn)題就是共享設(shè)備和獨(dú)占設(shè)備的問(wèn)題。有些I/O設(shè)備能夠被許多用戶共同使用。一些設(shè)備比如磁盤,讓多個(gè)用戶使用一般不會(huì) 產(chǎn)生什么問(wèn)題,但是某些設(shè)備必須具有獨(dú)占性,即只允許單個(gè)用戶使用完成后 才能讓其他用戶使用。下面,我們來(lái)探討一下如何使用程序來(lái)控制I/O 設(shè)備。一共有三種控制I/O設(shè)備的方法?使用程序控制I/O?使用中斷驅(qū)動(dòng)I/O? 使用DMA驅(qū)動(dòng)I/O使用程

37、序控制I/O使用程序控制I/O 又被稱為可編程I/O,它是指由CPU在驅(qū)動(dòng)程序軟件 控制下啟動(dòng)的數(shù)據(jù)傳輸,來(lái)訪問(wèn)設(shè)備上的寄存器或者其他存儲(chǔ)器。CPU會(huì)發(fā)出命令,然后等待I/O 操作的完成。由于CPU的速度比I/O模塊的速度快很多, 因此可編程I/O的問(wèn)題在于,CPU必須等待很長(zhǎng)時(shí)間才能等到處理結(jié)果。CPU 在等待時(shí)會(huì)采用輪詢(polling)或者忙等(busy waiting)的方式,結(jié)果,整個(gè)系統(tǒng)的性能被嚴(yán)重拉低??删幊蘄/O 十分簡(jiǎn)單,如果需要等待的時(shí)間非常短的話, 會(huì)經(jīng)歷如下操作I/O可編程I/O倒是一個(gè)很好的方式。一個(gè)可編程的 ? CPU請(qǐng)求I/O操作? I/O模塊執(zhí)行響應(yīng)? I/O模

38、塊設(shè)置狀態(tài)位? CPU會(huì)定期檢查狀態(tài)位? I/O不會(huì)直接通知CPU操作完成? I/O也不會(huì)中斷CPU? CPU可能會(huì)等待或在隨后的過(guò)程中返回的缺陷,我們提出一種改良方案,我們想要在 CPU使用中斷驅(qū)動(dòng)I/O鑒于上面可編程I/O等待I/O 設(shè)備的同時(shí),能夠做其他事情,等到I/O 設(shè)備完成后,它就會(huì)產(chǎn)生 一個(gè)中斷,這個(gè)中斷會(huì)停止當(dāng)前進(jìn)程并保存當(dāng)前的狀態(tài)。一個(gè)可能的示意圖如 未就GPU+ 未完成時(shí)間1 時(shí)間t2下盡管中斷減輕了 CPU和I/O 設(shè)備的等待時(shí)間的負(fù)擔(dān),但是由于還需要在 CPU和I/O模塊之前進(jìn)行大量的逐字傳輸,因此在大量數(shù)據(jù)傳輸中效率仍然很 低。下面是中斷的基本操作? CPU進(jìn)行讀取操

39、作? I/O設(shè)備從外圍設(shè)備獲取數(shù)據(jù),同時(shí) CPU執(zhí)行其他操作? I/O設(shè)備中斷通知CPU? CPU請(qǐng)求數(shù)據(jù)? I/O模塊傳輸數(shù)據(jù)所以我們現(xiàn)在著手需要解決的就是 CPU和I/O 模塊間數(shù)據(jù)傳輸?shù)男蕟?wèn)題。 使用DMA的I/ODMA的中文名稱是直接內(nèi)存訪問(wèn),它意味著 CPU授予I/O 模塊權(quán)限在不 涉及CPU的情況下讀取或?qū)懭雰?nèi)存。也就是 DMA可以不需要CPU的參與。這 個(gè)過(guò)程由稱為DMA控制器(DMA)的芯片管理。由于DMA設(shè)備可以直接在內(nèi) 存之間傳輸數(shù)據(jù),而不是使用 CPU作為中介,因此可以緩解總線上的擁塞。 DMA通過(guò)允許CPU執(zhí)行任務(wù),同時(shí)DMA系統(tǒng)通過(guò)系統(tǒng)和內(nèi)存總線傳輸數(shù)據(jù)來(lái) 提高系統(tǒng)

40、并發(fā)性。I/O層次結(jié)構(gòu)I/O軟件通常組織成四個(gè)層次,它們的大致結(jié)構(gòu)如下圖所示用戶級(jí)別的0軟件硬件每一層和其上下層都有明確的功能和接口。下面我們采用和計(jì)算機(jī)網(wǎng)絡(luò)相 反的套路,即自下而上的了解一下這些程序。下面是另一幅圖,這幅圖顯示了輸入/輸出軟件系統(tǒng)所有層及其主要功能。罔回復(fù)1; ES1/0; 01#禮8S完飆喚IS麗tffiftsissm. gas演膽挨作下面我們具體的來(lái)探討一下上面的層次結(jié)構(gòu) 中斷處理程序在計(jì)算機(jī)系統(tǒng)中,中斷就像女人的脾氣一樣無(wú)時(shí)無(wú)刻都在產(chǎn)生,中斷的出 現(xiàn)往往是讓人很不爽的。中斷處理程序又被稱為中斷服務(wù)程序或者是 ISR(Interrupt Service Routines)

41、 ,它是最靠近硬件的一層。中斷處理程序由 硬件中斷、軟件中斷或者是軟件異常啟動(dòng)產(chǎn)生的中斷,用于實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)程序 或受保護(hù)的操作模式(例如系統(tǒng)調(diào)用)之間的轉(zhuǎn)換。中斷處理程序負(fù)責(zé)處理中斷發(fā)生時(shí)的所有操作,操作完成后阻塞,然后啟 動(dòng)中斷驅(qū)動(dòng)程序來(lái)解決阻塞。通常會(huì)有三種通知方式,依賴于不同的具體實(shí)現(xiàn) ? 信號(hào)量實(shí)現(xiàn)中:在信號(hào)量上使用 up 進(jìn)行通知;? 管程實(shí)現(xiàn):對(duì)管程中的條件變量執(zhí)行 signal 操作? 還有一些情況是發(fā)送一些消息 不管哪種方式都是為了讓阻塞的中斷處理程序恢復(fù)運(yùn)行。? 非嵌套的中斷處理程序按照順序處理各個(gè)中斷,非嵌套的中斷處理程序也是最 簡(jiǎn)單的中斷處理? 嵌套的中斷處理程序會(huì)處理多

42、個(gè)中斷而無(wú)需分配優(yōu)先級(jí)? 可重入的中斷處理程序可使用優(yōu)先級(jí)處理多個(gè)中斷? 簡(jiǎn)單優(yōu)先級(jí)中斷處理程序可處理簡(jiǎn)單的中斷? 標(biāo)準(zhǔn)優(yōu)先級(jí)中斷處理程序比低優(yōu)先級(jí)的中斷處理程序在更短的時(shí)間能夠處理優(yōu) 先級(jí)更高的中斷? 高優(yōu)先級(jí) 中斷處理程序在短時(shí)間能夠處理優(yōu)先級(jí)更高的任務(wù),并直接進(jìn)入特 定的服務(wù)例程。? 優(yōu)先級(jí)分組中斷處理程序能夠處理不同優(yōu)先級(jí)的中斷任務(wù) 下面是一些通用的中斷處理程序的步驟,不同的操作系統(tǒng)實(shí)現(xiàn)細(xì)節(jié)不一樣? 保存所有沒(méi)有被中斷硬件保存的寄存器?為中斷服務(wù)程序設(shè)置上下文環(huán)境,可能包括設(shè)置 TLB MMI和頁(yè)表,如果不太了 解這三個(gè)概念,請(qǐng)參考另外一篇文章? 為中斷服務(wù)程序設(shè)置棧? 對(duì)中斷控制器作

43、出響應(yīng),如果不存在集中的中斷控制器,則繼續(xù)響應(yīng)中斷? 把寄存器從保存它的地方拷貝到進(jìn)程表中? 運(yùn)行中斷服務(wù)程序,它會(huì)從發(fā)出中斷的設(shè)備控制器的寄存器中提取信息? 操作系統(tǒng)會(huì)選擇一個(gè)合適的進(jìn)程來(lái)運(yùn)行。如果中斷造成了一些優(yōu)先級(jí)更高的進(jìn) 程變?yōu)榫途w態(tài),則選擇運(yùn)行這些優(yōu)先級(jí)高的進(jìn)程?為進(jìn)程設(shè)置MMU上下文,可能也會(huì)需要TLB,根據(jù)實(shí)際情況決定? 加載進(jìn)程的寄存器,包括 PSW 寄存器? 開始運(yùn)行新的進(jìn)程 上面我們羅列了一些大致的中斷步驟,不同性質(zhì)的操作系統(tǒng)和中斷處理程序能 夠處理的中斷步驟和細(xì)節(jié)也不盡相同,下面是一個(gè)嵌套中斷的具體運(yùn)行步驟11,中斷未完成運(yùn)行程序5,6.7.設(shè)備驅(qū)動(dòng)程序在上面的文章中我們

44、知道了設(shè)備控制器所做的工作。我們知道每個(gè)控制器 其內(nèi)部都會(huì)有寄存器用來(lái)和設(shè)備進(jìn)行溝通,發(fā)送指令,讀取設(shè)備的狀態(tài)等。I/O設(shè)備到設(shè)備控制器轉(zhuǎn)換。設(shè)備驅(qū)動(dòng)程序通常是操作 但是也可以構(gòu)造用戶空間因此,每個(gè)連接到計(jì)算機(jī)的I/O設(shè)備都需要有某些特定設(shè)備的代碼對(duì)其進(jìn) 行控制,例如鼠標(biāo)控制器需要從鼠標(biāo)接受指令,告訴下一步應(yīng)該移動(dòng)到哪里, 鍵盤控制器需要知道哪個(gè)按鍵被按下等。這些提供 的過(guò)程的代碼稱為 設(shè)備驅(qū)動(dòng)程序(Device driver)為了能夠訪問(wèn)設(shè)備的硬件,實(shí)際上也就意味著, 系統(tǒng)內(nèi)核的一部分,至少現(xiàn)在的體系結(jié)構(gòu)是這樣的。的設(shè)備驅(qū)動(dòng)程序,通過(guò)系統(tǒng)調(diào)用來(lái)完成讀寫操作。這樣就避免了一個(gè)問(wèn)題,有 問(wèn)題的驅(qū)

45、動(dòng)程序會(huì)干擾內(nèi)核,從而造成崩潰。所以,在用戶控件實(shí)現(xiàn)設(shè)備驅(qū)動(dòng) 程序是構(gòu)造系統(tǒng)穩(wěn)定性一個(gè)非常有用的措施。MINIX 3就是這么做的。下面是MINI 3的調(diào)用過(guò)程用戶逬軽戶空間然而,大多數(shù)桌面操作系統(tǒng)要求驅(qū)動(dòng)程序必須運(yùn)行在內(nèi)核中。在UNIX系統(tǒng)中,操作系統(tǒng)是一個(gè)二進(jìn)制程序,包含需要編譯到其內(nèi)部的 所有驅(qū)動(dòng)程序,如果你要對(duì) UNIX添加一個(gè)新設(shè)備,需要重新編譯內(nèi)核,將新 的驅(qū)動(dòng)程序裝到二進(jìn)制程序中。然而隨著大多數(shù)個(gè)人計(jì)算機(jī)的出現(xiàn),由于 I/O 設(shè)備的廣泛應(yīng)用,上面這種 靜態(tài)編譯的方式不再有效,因此,從 MS-DO開始,操作系統(tǒng)轉(zhuǎn)向驅(qū)動(dòng)程序在執(zhí) 行期間動(dòng)態(tài)的裝載到系統(tǒng)中。設(shè)備驅(qū)動(dòng)程序具有很多功能,比如

46、接受讀寫請(qǐng)求,對(duì)設(shè)備進(jìn)行初始化、管 理電源和日志、對(duì)輸入?yún)?shù)進(jìn)行有效性檢查等。設(shè)備驅(qū)動(dòng)程序接受到讀寫請(qǐng)求后,會(huì)檢查當(dāng)前設(shè)備是否在使用,如果設(shè)備 在使用,請(qǐng)求被排入隊(duì)列中,等待后續(xù)的處理。如果此時(shí)設(shè)備是空閑的,驅(qū)動(dòng) 程序會(huì)檢查硬件以了解請(qǐng)求是否能夠被處理。在傳輸開始前,會(huì)啟動(dòng)設(shè)備或者 馬達(dá)。等待設(shè)備就緒完成,再進(jìn)行實(shí)際的控制??刂圃O(shè)備就是對(duì)設(shè)備發(fā)出指 令。發(fā)出命令后,設(shè)備控制器便開始將它們寫入控制器的設(shè)備寄存器。在將每 個(gè)命令寫入控制器后,會(huì)檢查控制器是否接受了這條命令并準(zhǔn)備接受下一個(gè)命 令。一般控制設(shè)備會(huì)發(fā)出一系列的指令,這稱為指令序列,設(shè)備控制器會(huì)依次 檢查每個(gè)命令是否被接受,下一條指令是否

47、能夠被接收,直到所有的序列發(fā)出為止。發(fā)出指令后,一般會(huì)有兩種可能出現(xiàn)的情況。在大多數(shù)情況下,設(shè)備驅(qū)動(dòng) 程序會(huì)進(jìn)行等待直到控制器完成它的事情。這里需要了解一下設(shè)備控制器的概 念設(shè)備控制器的主要主責(zé)是控制一個(gè)或多個(gè)I/O 設(shè)備,以實(shí)現(xiàn)I/O 設(shè)備和計(jì)算機(jī)之間的數(shù)據(jù)交換。設(shè)備控制器接收從CPU發(fā)送過(guò)來(lái)的指令,繼而達(dá)到控制硬件的目的 設(shè)備控制器是一個(gè)可編址的設(shè)備,當(dāng)它僅控制一個(gè)設(shè)備時(shí),它只有一個(gè)唯 一的設(shè)備地址;如果設(shè)備控制器控制多個(gè)可連接設(shè)備時(shí),則應(yīng)含有多個(gè)設(shè)備地 址,并使每一個(gè)設(shè)備地址對(duì)應(yīng)一個(gè)設(shè)備。設(shè)備控制器主要分為兩種:字符設(shè)備和塊設(shè)備設(shè)備控制器的主要功能有下面這些?接收和識(shí)別命令:設(shè)備控制器可

48、以接受來(lái)自 CPU的指令,并進(jìn)行識(shí)別。設(shè)備控 制器內(nèi)部也會(huì)有寄存器,用來(lái)存放指令和參數(shù)?進(jìn)行數(shù)據(jù)交換:CPU控制器和設(shè)備之間會(huì)進(jìn)行數(shù)據(jù)的交換,CPU通過(guò)總線把指令發(fā)送給控制器,或從控制器中并行地讀出數(shù)據(jù);控制器將數(shù)據(jù)寫入指定設(shè)備。?地址識(shí)別:每個(gè)硬件設(shè)備都有自己的地址,設(shè)備控制器能夠識(shí)別這些不同的地 址,來(lái)達(dá)到控制硬件的目的,此外,為使 CPU能向寄存器中寫入或者讀取數(shù)據(jù), 這些寄存器都應(yīng)具有唯一的地址。?差錯(cuò)檢測(cè):設(shè)備控制器還具有對(duì)設(shè)備傳遞過(guò)來(lái)的數(shù)據(jù)進(jìn)行檢測(cè)的功能。在這種情況下,設(shè)備控制器會(huì)阻塞,直到中斷來(lái)解除阻塞狀態(tài)。還有一種 情況是操作是可以無(wú)延遲的完成,所以驅(qū)動(dòng)程序不需要阻塞。在第一種

49、情況下, 操作系統(tǒng)可能被中斷喚醒;第二種情況下操作系統(tǒng)不會(huì)被休眠。設(shè)備驅(qū)動(dòng)程序必須是可重入的,因?yàn)樵O(shè)備驅(qū)動(dòng)程序會(huì)阻塞和喚醒然后再次 阻塞。驅(qū)動(dòng)程序不允許進(jìn)行系統(tǒng)調(diào)用,但是它們通常需要與內(nèi)核的其余部分進(jìn) 行交互。與設(shè)備無(wú)關(guān)的I/O軟件I/O軟件有兩種,一種是我們上面介紹過(guò)的基于特定設(shè)備的,還有一種是 設(shè)備無(wú)關(guān)性的,設(shè)備無(wú)關(guān)性也就是不需要特定的設(shè)備。設(shè)備驅(qū)動(dòng)程序與設(shè)備無(wú) 關(guān)的軟件之間的界限取決于具體的系統(tǒng)。下面顯示的功能由設(shè)備無(wú)關(guān)的軟件實(shí) 現(xiàn)與設(shè)備無(wú)關(guān)的軟件的基本功能是對(duì)所有設(shè)備執(zhí)行公共的I/O 功能,并且向用戶層軟件提供一個(gè)統(tǒng)一的接口。緩沖無(wú)論是對(duì)于塊設(shè)備還是字符設(shè)備來(lái)說(shuō),緩沖都是一個(gè)非常重要的

50、考量標(biāo)準(zhǔn)。 下面是從ADSL調(diào)制解調(diào)器)讀取數(shù)據(jù)的過(guò)程,調(diào)制解調(diào)器是我們用來(lái)聯(lián)網(wǎng)的設(shè) 備。用戶程序調(diào)用read系統(tǒng)調(diào)用阻塞用戶進(jìn)程,等待字符的到來(lái),這是對(duì)到 來(lái)的字符進(jìn)行處理的一種方式。每一個(gè)到來(lái)的字符都會(huì)造成中斷。中斷服務(wù)程 序會(huì)給用戶進(jìn)程提供字符,并解除阻塞。將字符提供給用戶程序后,進(jìn)程會(huì)去 讀取其他字符并繼續(xù)阻塞,這種模型如下用戶逬程中斷服務(wù)程序會(huì)直接把 ADSL調(diào)I制解調(diào)器中的 字符提供給用戶逬程用戶空間內(nèi)核空間flAjyosL這一種方案是沒(méi)有緩沖區(qū)的存在,因?yàn)橛脩暨M(jìn)程如果讀不到數(shù)據(jù)會(huì)阻塞, 直到讀到數(shù)據(jù)為止,這種情況效率比較低,而且阻塞式的方式,會(huì)直接阻止用 戶進(jìn)程做其他事情,這對(duì)用

51、戶來(lái)說(shuō)是不能接受的。還有一種情況就是每次用戶 進(jìn)程都會(huì)重啟,對(duì)于每個(gè)字符的到來(lái)都會(huì)重啟用戶進(jìn)程,這種效率會(huì)嚴(yán)重降低, 所以無(wú)緩沖區(qū)的軟件不是一個(gè)很好的設(shè)計(jì)。作為一個(gè)改良點(diǎn),我們可以嘗試在用戶空間中使用一個(gè)能讀取n個(gè)字節(jié)緩沖區(qū)來(lái)讀取n個(gè)字符。這樣的話,中斷服務(wù)程序會(huì)把字符放到緩沖區(qū)中直到緩 沖區(qū)變滿為止,然后再去喚醒用戶進(jìn)程。這種方案要比上面的方案改良很多。中斷服務(wù)程序會(huì)向用戶進(jìn)程的緩沖E寫入數(shù)據(jù),直到數(shù)據(jù)滿了之后再喚醒用戶進(jìn)程用戶進(jìn)程用戶空間內(nèi)核空間rADSLk._J但是這種方案也存在問(wèn)題,當(dāng)字符到來(lái)時(shí),如果緩沖區(qū)被調(diào)出內(nèi)存會(huì)出現(xiàn) 什么問(wèn)題?解決方案是把緩沖區(qū)鎖定在內(nèi)存中,但是這種方案也會(huì)出現(xiàn)

52、問(wèn)題, 如果少量的緩沖區(qū)被鎖定還好,如果大量的緩沖區(qū)被鎖定在內(nèi)存中,那么可以 換進(jìn)換出的頁(yè)面就會(huì)收縮,造成系統(tǒng)性能的下降。一種解決方案是在內(nèi)核中內(nèi)部創(chuàng)建一塊緩沖區(qū),讓中斷服務(wù)程序?qū)⒆址?在內(nèi)核內(nèi)部的緩沖區(qū)中。2當(dāng)內(nèi)檣緩沖區(qū)滿了,再把用戶空間當(dāng)內(nèi)核中的緩沖區(qū)要滿的時(shí)候,會(huì)將用戶空間中的頁(yè)面調(diào)入內(nèi)存,然后將 內(nèi)核空間的緩沖區(qū)復(fù)制到用戶空間的緩沖區(qū)中,這種方案也面臨一個(gè)問(wèn)題就是 假如用戶空間的頁(yè)面被換入內(nèi)存,此時(shí)內(nèi)核空間的緩沖區(qū)已滿,這時(shí)候仍有新 的字符到來(lái),這個(gè)時(shí)候會(huì)怎么辦?因?yàn)榫彌_區(qū)滿了,沒(méi)有空間來(lái)存儲(chǔ)新的字符 了。一種非常簡(jiǎn)單的方式就是再設(shè)置一個(gè)緩沖區(qū)就行了,在第一個(gè)緩沖區(qū)填滿 后,在緩沖區(qū)

53、清空前,使用第二個(gè)緩沖區(qū),這種解決方式如下Z當(dāng)內(nèi)沖區(qū)滿了,再把用戶間 的頁(yè)面調(diào)人,把8據(jù)制到用戶韁沖E中用,進(jìn)程用戶空間I內(nèi)空間力在內(nèi)空間中放一個(gè)S沖S 1 先把據(jù)寫到內(nèi)沖區(qū)中ADSL3 fisa向用戶S間寫入的過(guò)程中 有新的字符出現(xiàn),就會(huì)篋新放在I 內(nèi)檢空間的S二個(gè)a沖區(qū)中當(dāng)?shù)诙€(gè)緩沖區(qū)也滿了的時(shí)候,它也會(huì)把數(shù)據(jù)復(fù)制到用戶空間中,然后第 一個(gè)緩沖區(qū)用于接受新的字符。這種具有兩個(gè)緩沖區(qū)的設(shè)計(jì)被稱為雙緩沖 (double bufferi ng) 。還有一種緩沖形式是循環(huán)緩沖(circular buffer)。它由一個(gè)內(nèi)存區(qū)域和兩個(gè)指針組成。一個(gè)指針指向下一個(gè)空閑字,新的數(shù)據(jù)可以放在此處。另外一個(gè)

54、 指針指向緩沖區(qū)中尚未刪除數(shù)據(jù)的第一個(gè)字。在許多情況下,硬件會(huì)在添加新 的數(shù)據(jù)時(shí),移動(dòng)第一個(gè)指針;而操作系統(tǒng)會(huì)在刪除和處理無(wú)用數(shù)據(jù)時(shí)會(huì)移動(dòng)第 二個(gè)指針。兩個(gè)指針到達(dá)頂部時(shí)就回到底部重新開始。緩沖區(qū)對(duì)輸出來(lái)說(shuō)也很重要。對(duì)輸出的描述和輸入相似緩沖技術(shù)應(yīng)用廣泛, 但它也有缺點(diǎn)。如果數(shù)據(jù)被緩沖次數(shù)太多,會(huì)影響性能。考慮例如如下這種情 況。數(shù)據(jù)經(jīng)過(guò)用戶進(jìn)程- 內(nèi)核空間- 網(wǎng)絡(luò)控制器,這里的網(wǎng)絡(luò)控制器應(yīng)該 就相當(dāng)于是socket緩沖區(qū),然后發(fā)送到網(wǎng)絡(luò)上,再到接收方的網(wǎng)絡(luò)控制器-接收方的內(nèi)核緩沖- 接收方的用戶緩沖,一條數(shù)據(jù)包被緩存了太多次,很容 易降低性能。錯(cuò)誤處理在I/O 中,出錯(cuò)是一種再正常不過(guò)的情況

55、了。當(dāng)出錯(cuò)發(fā)生時(shí),操作系統(tǒng)必 須盡可能處理這些錯(cuò)誤。有一些錯(cuò)誤是只有特定的設(shè)備才能處理,有一些是由 框架進(jìn)行處理,這些錯(cuò)誤和特定的設(shè)備無(wú)關(guān)。I/O錯(cuò)誤的一類是程序員編程錯(cuò)誤,比如還沒(méi)有打開文件前就讀流,或者 不關(guān)閉流導(dǎo)致內(nèi)存溢出等等。這類問(wèn)題由程序員處理;另外一類是實(shí)際的I/O錯(cuò)誤,例如向一個(gè)磁盤壞塊寫入數(shù)據(jù),無(wú)論怎么寫都寫入不了。這類問(wèn)題由驅(qū) 動(dòng)程序處理,驅(qū)動(dòng)程序處理不了交給硬件處理,這個(gè)我們上面也說(shuō)過(guò)。 設(shè)備驅(qū)動(dòng)程序統(tǒng)一接口我們?cè)诓僮飨到y(tǒng)概述中說(shuō)到,操作系統(tǒng)一個(gè)非常重要的功能就是屏蔽了硬 件和軟件的差異性,為硬件和軟件提供了統(tǒng)一的標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)還體現(xiàn)在為設(shè) 備驅(qū)動(dòng)程序提供統(tǒng)一的接口,因?yàn)椴?/p>

56、同的硬件和廠商編寫的設(shè)備驅(qū)動(dòng)程序不同, 所以如果為每個(gè)驅(qū)動(dòng)程序都單獨(dú)提供接口的話,這樣沒(méi)法搞,所以必須統(tǒng)一。 分配和釋放一些設(shè)備例如打印機(jī),它只能由一個(gè)進(jìn)程來(lái)使用,這就需要操作系統(tǒng)根據(jù) 實(shí)際情況判斷是否能夠?qū)υO(shè)備的請(qǐng)求進(jìn)行檢查,判斷是否能夠接受其他請(qǐng)求, 一種比較簡(jiǎn)單直接的方式是在特殊文件上執(zhí)行open操作。如果設(shè)備不可用,那么直接open會(huì)導(dǎo)致失敗。還有一種方式是不直接導(dǎo)致失敗,而是讓其阻塞, 等到另外一個(gè)進(jìn)程釋放資源后,在進(jìn)行 open打開操作。這種方式就把選擇權(quán) 交給了用戶,由用戶判斷是否應(yīng)該等待。注意:阻塞的實(shí)現(xiàn)有多種方式,有阻塞隊(duì)列等 設(shè)備無(wú)關(guān)的塊不同的磁盤會(huì)具有不同的扇區(qū)大小,但是軟件不會(huì)關(guān)心扇區(qū)大小,只管存 儲(chǔ)就是了。一些字符設(shè)備可以一次一個(gè)字節(jié)的交付數(shù)據(jù),而其他的設(shè)備則以較 大的單位交付數(shù)據(jù),

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論