自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

計(jì)算機(jī)最魔幻的事情就是它能感知到你的思想

運(yùn)維 系統(tǒng)運(yùn)維 存儲(chǔ)設(shè)備
我們之前的文章提到了操作系統(tǒng)的三個(gè)抽象,它們分別是進(jìn)程、地址空間和文件,除此之外,操作系統(tǒng)還要控制所有的 I/O 設(shè)備。

 [[322587]]

我們之前的文章提到了操作系統(tǒng)的三個(gè)抽象,它們分別是進(jìn)程、地址空間和文件,除此之外,操作系統(tǒng)還要控制所有的 I/O 設(shè)備。操作系統(tǒng)必須向設(shè)備發(fā)送命令,捕捉中斷并處理錯(cuò)誤。它還應(yīng)該在設(shè)備和操作系統(tǒng)的其余部分之間提供一個(gè)簡單易用的接口。操作系統(tǒng)如何管理 I/O 是我們接下來的重點(diǎn)。

不同的人對 I/O 硬件的理解也不同。對于電子工程師而言,I/O 硬件就是芯片、導(dǎo)線、電源和其他組成硬件的物理設(shè)備。而我們程序員眼中的 I/O 其實(shí)就是硬件提供給軟件的接口,比如硬件接受到的命令、執(zhí)行的操作以及反饋的錯(cuò)誤。我們著重探討的是如何對硬件進(jìn)行編程,而不是其工作原理。

I/O 設(shè)備

什么是 I/O 設(shè)備?I/O 設(shè)備又叫做輸入/輸出設(shè)備,它是人類用來和計(jì)算機(jī)進(jìn)行通信的外部硬件。輸入/輸出設(shè)備能夠向計(jì)算機(jī)發(fā)送數(shù)據(jù)(輸出)并從計(jì)算機(jī)接收數(shù)據(jù)(輸入)。

I/O 設(shè)備(I/O devices)可以分成兩種:塊設(shè)備(block devices) 和 字符設(shè)備(character devices)。

塊設(shè)備

塊設(shè)備是一個(gè)能存儲(chǔ)固定大小塊信息的設(shè)備,它支持以固定大小的塊,扇區(qū)或群集讀取和(可選)寫入數(shù)據(jù)。每個(gè)塊都有自己的物理地址。通常塊的大小在 512 - 65536 之間。所有傳輸?shù)男畔⒍紩?huì)以連續(xù)的塊為單位。塊設(shè)備的基本特征是每個(gè)塊都較為對立,能夠獨(dú)立的進(jìn)行讀寫。常見的塊設(shè)備有 硬盤、藍(lán)光光盤、USB 盤

與字符設(shè)備相比,塊設(shè)備通常需要較少的引腳。

 


 

 

塊設(shè)備的缺點(diǎn)

基于給定固態(tài)存儲(chǔ)器的塊設(shè)備比基于相同類型的存儲(chǔ)器的字節(jié)尋址要慢一些,因?yàn)楸仨氃趬K的開頭開始讀取或?qū)懭搿K?,要讀取該塊的任何部分,必須尋找到該塊的開始,讀取整個(gè)塊,如果不使用該塊,則將其丟棄。要寫入塊的一部分,必須尋找到塊的開始,將整個(gè)塊讀入內(nèi)存,修改數(shù)據(jù),再次尋找到塊的開頭處,然后將整個(gè)塊寫回設(shè)備。

字符設(shè)備

另一類 I/O 設(shè)備是字符設(shè)備。字符設(shè)備以字符為單位發(fā)送或接收一個(gè)字符流,而不考慮任何塊結(jié)構(gòu)。字符設(shè)備是不可尋址的,也沒有任何尋道操作。常見的字符設(shè)備有 打印機(jī)、網(wǎng)絡(luò)設(shè)備、鼠標(biāo)、以及大多數(shù)與磁盤不同的設(shè)備。

 

下面顯示了一些常見設(shè)備的數(shù)據(jù)速率。

 

設(shè)備控制器

首先需要先了解一下設(shè)備控制器的概念。

設(shè)備控制器是處理 CPU 傳入和傳出信號的系統(tǒng)。設(shè)備通過插頭和插座連接到計(jì)算機(jī),并且插座連接到設(shè)備控制器。設(shè)備控制器從連接的設(shè)備處接收數(shù)據(jù),并將其存儲(chǔ)在控制器內(nèi)部的一些特殊目的寄存器(special purpose registers) 也就是本地緩沖區(qū)中。

特殊用途寄存器,顧名思義是僅為一項(xiàng)任務(wù)而設(shè)計(jì)的寄存器。例如,cs,ds,gs 和其他段寄存器屬于特殊目的寄存器,因?yàn)樗鼈兊拇嬖谑菫榱吮4娑翁?。eax,ecx 等是一般用途的寄存器,因?yàn)槟憧梢詿o限制地使用它們。例如,你不能移動(dòng) ds,但是可以移動(dòng) eax,ebx。通用目的寄存器比如有:eax、ecx、edx、ebx、esi、edi、ebp、esp特殊目的寄存器比如有:cs、ds、ss、es、fs、gs、eip、flag”每個(gè)設(shè)備控制器都會(huì)有一個(gè)應(yīng)用程序與之對應(yīng),設(shè)備控制器通過應(yīng)用程序的接口通過中斷與操作系統(tǒng)進(jìn)行通信。設(shè)備控制器是硬件,而設(shè)備驅(qū)動(dòng)程序是軟件。

I/O 設(shè)備通常由機(jī)械組件(mechanical component)和電子組件(electronic component)構(gòu)成。電子組件被稱為 設(shè)備控制器(device controller)或者 適配器(adapter)。在個(gè)人計(jì)算機(jī)上,它通常采用可插入(PCIe)擴(kuò)展插槽的主板上的芯片或印刷電路卡的形式。

 

機(jī)械設(shè)備就是它自己,它的組成如下

 

控制器卡上通常會(huì)有一個(gè)連接器,通向設(shè)備本身的電纜可以插入到這個(gè)連接器中,很多控制器可以操作 2 個(gè)、4 個(gè)設(shè)置 8 個(gè)相同的設(shè)備。

控制器與設(shè)備之間的接口通常是一個(gè)低層次的接口。例如,磁盤可能被格式化為 2,000,000 個(gè)扇區(qū),每個(gè)扇區(qū) 512 字節(jié)。然而,實(shí)際從驅(qū)動(dòng)出來的卻是一個(gè)串行的比特流,從一個(gè)前導(dǎo)符(preamble)開始,然后是一個(gè)扇區(qū)中的 4096 位,最后是一個(gè)校驗(yàn)和 或 ECC(錯(cuò)誤碼,Error-Correcting Code)。前導(dǎo)符是在對磁盤進(jìn)行格式化的時(shí)候?qū)懮先サ?,它包括柱面?shù)和扇區(qū)號,扇區(qū)大小以及類似的數(shù)據(jù),此外還包含同步信息。

控制器的任務(wù)是把串行的位流轉(zhuǎn)換為字節(jié)塊,并進(jìn)行必要的錯(cuò)誤校正工作。字節(jié)塊通常會(huì)在控制器內(nèi)部的一個(gè)緩沖區(qū)按位進(jìn)行組裝,然后再對校驗(yàn)和進(jìn)行校驗(yàn)并證明字節(jié)塊沒有錯(cuò)誤后,再將它復(fù)制到內(nèi)存中。

內(nèi)存映射 I/O

每個(gè)控制器都會(huì)有幾個(gè)寄存器用來和 CPU 進(jìn)行通信。通過寫入這些寄存器,操作系統(tǒng)可以命令設(shè)備發(fā)送數(shù)據(jù),接收數(shù)據(jù)、開啟或者關(guān)閉設(shè)備等。通過從這些寄存器中讀取信息,操作系統(tǒng)能夠知道設(shè)備的狀態(tài),是否準(zhǔn)備接受一個(gè)新命令等。

為了控制寄存器,許多設(shè)備都會(huì)有數(shù)據(jù)緩沖區(qū)(data buffer),來供系統(tǒng)進(jìn)行讀寫。例如,在屏幕上顯示一個(gè)像素的常規(guī)方法是使用一個(gè)視頻 RAM,這一 RAM 基本上只是一個(gè)數(shù)據(jù)緩沖區(qū),用來供程序和操作系統(tǒng)寫入數(shù)據(jù)。

那么問題來了,CPU 如何與設(shè)備寄存器和設(shè)備數(shù)據(jù)緩沖區(qū)進(jìn)行通信呢?存在兩個(gè)可選的方式。第一種方法是,每個(gè)控制寄存器都被分配一個(gè) I/O 端口(I/O port)號,這是一個(gè) 8 位或 16 位的整數(shù)。所有 I/O 端口的集合形成了受保護(hù)的 I/O 端口空間,以便普通用戶程序無法訪問它(只有操作系統(tǒng)可以訪問)。使用特殊的 I/O 指令像是

  1. IN REG,PORT 

CPU 可以讀取控制寄存器 PORT 的內(nèi)容并將結(jié)果放在 CPU 寄存器 REG 中。類似的,使用

  1. OUT PORT,REG 

CPU 可以將 REG 的內(nèi)容寫到控制寄存器中。大多數(shù)早期計(jì)算機(jī),包括幾乎所有大型主機(jī),如 IBM 360 及其所有后續(xù)機(jī)型,都是以這種方式工作的。

控制寄存器是一個(gè)處理器寄存器而改變或控制的一般行為 CPU 或其他數(shù)字設(shè)備??刂萍拇嫫鲌?zhí)行的常見任務(wù)包括中斷控制,切換尋址模式,分頁控制和協(xié)處理器控制。”在這一方案中,內(nèi)存地址空間和 I/O 地址空間是不相同的,如下圖所示

 

指令

  1. IN R0,4 

  1. MOV R0,4 

這一設(shè)計(jì)中完全不同。前者讀取 I/O端口 4 的內(nèi)容并將其放入 R0,而后者讀取存儲(chǔ)器字 4 的內(nèi)容并將其放入 R0。這些示例中的 4 代表不同且不相關(guān)的地址空間。

第二個(gè)方法是 PDP-11 引入的,

什么是 PDP-11?

 

”它將所有控制寄存器映射到內(nèi)存空間中,如下圖所示

 

內(nèi)存映射的 I/O是在 CPU 與其連接的外圍設(shè)備之間交換數(shù)據(jù)和指令的一種方式,這種方式是處理器和 IO 設(shè)備共享同一內(nèi)存位置的內(nèi)存,即處理器和 IO 設(shè)備使用內(nèi)存地址進(jìn)行映射。

在大多數(shù)系統(tǒng)中,分配給控制寄存器的地址位于或者靠近地址的頂部附近。

下面是采用的一種混合方式

 

這種方式具有與內(nèi)存映射 I/O 的數(shù)據(jù)緩沖區(qū),而控制寄存器則具有單獨(dú)的 I/O 端口。x86 采用這一體系結(jié)構(gòu)。在 IBM PC 兼容機(jī)中,除了 0 到 64K - 1 的 I/O 端口之外,640 K 到 1M - 1 的內(nèi)存地址保留給設(shè)備的數(shù)據(jù)緩沖區(qū)。

這些方案是如何工作的呢?當(dāng) CPU 想要讀入一個(gè)字的時(shí)候,無論是從內(nèi)存中讀入還是從 I/O 端口讀入,它都要將需要的地址放到總線地址線上,然后在總線的一條控制線上調(diào)用一個(gè) READ 信號。還有第二條信號線來表明需要的是 I/O 空間還是內(nèi)存空間。如果是內(nèi)存空間,內(nèi)存將響應(yīng)請求。如果是 I/O 空間,那么 I/O 設(shè)備將響應(yīng)請求。如果只有內(nèi)存空間,那么每個(gè)內(nèi)存模塊和每個(gè) I/O 設(shè)備都會(huì)將地址線和它所服務(wù)的地址范圍進(jìn)行比較。如果地址落在這一范圍之內(nèi),它就會(huì)響應(yīng)請求。絕對不會(huì)出現(xiàn)地址既分配給內(nèi)存又分配給 I/O 設(shè)備,所以不會(huì)存在歧義和沖突。

內(nèi)存映射 I/O 的優(yōu)點(diǎn)和缺點(diǎn)

這兩種尋址控制器的方案具有不同的優(yōu)缺點(diǎn)。先來看一下內(nèi)存映射 I/O 的優(yōu)點(diǎn)。

  • 第一,如果需要特殊的 I/O 指令讀寫設(shè)備控制寄存器,那么訪問這些寄存器需要使用匯編代碼,因?yàn)樵?C 或 C++ 中不存在執(zhí)行 IN 和 OUT指令的方法。調(diào)用這樣的過程增加了 I/O 的開銷。在內(nèi)存映射中,控制寄存器只是內(nèi)存中的變量,在 C 語言中可以和其他變量一樣進(jìn)行尋址。
  • 第二,對于內(nèi)存映射 I/O ,不需要特殊的保護(hù)機(jī)制就能夠阻止用戶進(jìn)程執(zhí)行 I/O 操作。操作系統(tǒng)需要保證的是禁止把控制寄存器的地址空間放在用戶的虛擬地址中就可以了。
  • 第三,對于內(nèi)存映射 I/O,可以引用內(nèi)存的每一條指令也可以引用控制寄存器,便于引用。

在計(jì)算機(jī)設(shè)計(jì)中,幾乎所有的事情都要權(quán)衡。內(nèi)存映射 I/O 也是一樣,它也有自己的缺點(diǎn)。首先,大部分計(jì)算機(jī)現(xiàn)在都會(huì)有一些對于內(nèi)存字的緩存。緩存一個(gè)設(shè)備控制寄存器的代價(jià)是很大的。為了避免這種內(nèi)存映射 I/O 的情況,硬件必須有選擇性的禁用緩存,例如,在每個(gè)頁面上禁用緩存,這個(gè)功能為硬件和操作系統(tǒng)增加了額外的復(fù)雜性,因此必須選擇性的進(jìn)行管理。

第二點(diǎn),如果僅僅只有一個(gè)地址空間,那么所有的內(nèi)存模塊(memory modules)和所有的 I/O 設(shè)備都必須檢查所有的內(nèi)存引用來推斷出誰來進(jìn)行響應(yīng)。

什么是內(nèi)存模塊?在計(jì)算中,存儲(chǔ)器模塊是其上安裝有存儲(chǔ)器集成電路的印刷電路板。”

 

如果計(jì)算機(jī)是一種單總線體系結(jié)構(gòu)的話,如下圖所示

 

讓每個(gè)內(nèi)存模塊和 I/O 設(shè)備查看每個(gè)地址是簡單易行的。

然而,現(xiàn)代個(gè)人計(jì)算機(jī)的趨勢是專用的高速內(nèi)存總線,如下圖所示

 

裝備這一總線是為了優(yōu)化內(nèi)存訪問速度,x86 系統(tǒng)還可以有多種總線(內(nèi)存、PCIe、SCSI 和 USB)。如下圖所示

 

在內(nèi)存映射機(jī)器上使用單獨(dú)的內(nèi)存總線的麻煩之處在于,I/O 設(shè)備無法通過內(nèi)存總線查看內(nèi)存地址,因此它們無法對其進(jìn)行響應(yīng)。此外,必須采取特殊的措施使內(nèi)存映射 I/O 工作在具有多總線的系統(tǒng)上。一種可能的方法是首先將全部內(nèi)存引用發(fā)送到內(nèi)存,如果內(nèi)存響應(yīng)失敗,CPU 再嘗試其他總線。

第二種設(shè)計(jì)是在內(nèi)存總線上放一個(gè)探查設(shè)備,放過所有潛在指向所關(guān)注的 I/O 設(shè)備的地址。此處的問題是,I/O 設(shè)備可能無法以內(nèi)存所能達(dá)到的速度處理請求。

第三種可能的設(shè)計(jì)是在內(nèi)存控制器中對地址進(jìn)行過濾,這種設(shè)計(jì)與上圖所描述的設(shè)計(jì)相匹配。這種情況下,內(nèi)存控制器芯片中包含在引導(dǎo)時(shí)預(yù)裝載的范圍寄存器。這一設(shè)計(jì)的缺點(diǎn)是需要在引導(dǎo)時(shí)判定哪些內(nèi)存地址而不是真正的內(nèi)存地址。因而,每一設(shè)計(jì)都有支持它和反對它的論據(jù),所以折中和權(quán)衡是不可避免的。

直接內(nèi)存訪問

無論一個(gè) CPU 是否具有內(nèi)存映射 I/O,它都需要尋址設(shè)備控制器以便與它們交換數(shù)據(jù)。CPU 可以從 I/O 控制器每次請求一個(gè)字節(jié)的數(shù)據(jù),但是這么做會(huì)浪費(fèi) CPU 時(shí)間,所以經(jīng)常會(huì)用到一種稱為直接內(nèi)存訪問(Direct Memory Access) 的方案。為了簡化,我們假設(shè) CPU 通過單一的系統(tǒng)總線訪問所有的設(shè)備和內(nèi)存,該總線連接 CPU 、內(nèi)存和 I/O 設(shè)備,如下圖所示

 

現(xiàn)代操作系統(tǒng)實(shí)際更為復(fù)雜,但是原理是相同的。如果硬件有DMA 控制器,那么操作系統(tǒng)只能使用 DMA。有時(shí)這個(gè)控制器會(huì)集成到磁盤控制器和其他控制器中,但這種設(shè)計(jì)需要在每個(gè)設(shè)備上都裝有一個(gè)分離的 DMA 控制器。單個(gè)的 DMA 控制器可用于向多個(gè)設(shè)備傳輸,這種傳輸往往同時(shí)進(jìn)行。

不管 DMA 控制器的物理地址在哪,它都能夠獨(dú)立于 CPU 從而訪問系統(tǒng)總線,如上圖所示。它包含幾個(gè)可由 CPU 讀寫的寄存器,其中包括一個(gè)內(nèi)存地址寄存器,字節(jié)計(jì)數(shù)寄存器和一個(gè)或多個(gè)控制寄存器??刂萍拇嫫髦付ㄒ褂玫?I/O 端口、傳送方向(從 I/O 設(shè)備讀或?qū)懙?I/O 設(shè)備)、傳送單位(每次一個(gè)字節(jié)或者每次一個(gè)字)以及在一次突發(fā)傳送中要傳送的字節(jié)數(shù)。

為了解釋 DMA 的工作原理,我們首先看一下不使用 DMA 該如何進(jìn)行磁盤讀取。

首先,控制器從磁盤驅(qū)動(dòng)器串行地、一位一位的讀一個(gè)塊(一個(gè)或多個(gè)扇區(qū)),直到將整塊信息放入控制器的內(nèi)部緩沖區(qū)。

讀取校驗(yàn)和以保證沒有發(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è)過程就會(huì)變得不一樣了。首先 CPU 通過設(shè)置 DMA 控制器的寄存器對它進(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 控制器通過在總線上發(fā)出一個(gè)讀請求到磁盤控制器而發(fā)起 DMA 傳送,這是第二步。這個(gè)讀請求就像其他讀請求一樣,磁盤控制器并不知道或者并不關(guān)心它是來自 CPU 還是來自 DMA 控制器。通常情況下,要寫的內(nèi)存地址在總線的地址線上,所以當(dāng)磁盤控制器去匹配下一個(gè)字時(shí),它知道將該字寫到什么地方。寫到內(nèi)存就是另外一個(gè)總線循環(huán)了,這是第三步。當(dāng)寫操作完成時(shí),磁盤控制器在總線上發(fā)出一個(gè)應(yīng)答信號到 DMA 控制器,這是第四步。

然后,DMA 控制器會(huì)增加內(nèi)存地址并減少字節(jié)數(shù)量。如果字節(jié)數(shù)量仍然大于 0 ,就會(huì)循環(huán)步驟 2 - 步驟 4 ,直到字節(jié)計(jì)數(shù)變?yōu)?0 。此時(shí),DMA 控制器會(huì)打斷 CPU 并告訴它傳輸已經(jīng)完成了。操作系統(tǒng)開始運(yùn)行時(shí),它不會(huì)把磁盤塊拷貝到內(nèi)存中,因?yàn)樗呀?jīng)在內(nèi)存中了。

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

許多總線能夠以兩種模式操作:每次一字模式和塊模式。一些 DMA 控制器也能夠使用這兩種方式進(jìn)行操作。在前一個(gè)模式中,DMA 控制器請求傳送一個(gè)字并得到這個(gè)字。如果 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)行的是長時(shí)間的突發(fā)傳送,有可能將 CPU 和其他設(shè)備阻塞很長的時(shí)間。

在我們討論的這種模型中,有時(shí)被稱為 飛越模式(fly-by mode),DMA 控制器會(huì)告訴設(shè)備控制器把數(shù)據(jù)直接傳遞到內(nèi)存。一些 DMA 控制器使用的另一種模式是讓設(shè)備控制器將字發(fā)送給 DMA 控制器,然后 DMA 控制器發(fā)出第二條總線請求,將字寫到任何可以寫入的地方。采用這種方案,每個(gè)傳輸?shù)淖侄夹枰粋€(gè)額外的總線周期,但是更加靈活,因?yàn)樗€可以執(zhí)行設(shè)備到設(shè)備的復(fù)制,甚至是內(nèi)存到內(nèi)存的復(fù)制(通過事先對內(nèi)存進(jìn)行讀取,然后對內(nèi)存進(jìn)行寫入)。

大部分的 DMA 控制器使用物理地址進(jìn)行傳輸。使用物理地址需要操作系統(tǒng)將目標(biāo)內(nèi)存緩沖區(qū)的虛擬地址轉(zhuǎn)換為物理地址,并將該物理地址寫入 DMA 控制器的地址寄存器中。另一種方案是一些 DMA 控制器將虛擬地址寫入 DMA 控制器中。然后,DMA 控制器必須使用 MMU 才能完成虛擬到物理的轉(zhuǎn)換。僅當(dāng) MMU 是內(nèi)存的一部分而不是 CPU 的一部分時(shí),才可以將虛擬地址放在總線上。

重溫中斷

在一臺(tái)個(gè)人計(jì)算機(jī)體系結(jié)構(gòu)中,中斷結(jié)構(gòu)會(huì)如下所示

 

當(dāng)一個(gè) I/O 設(shè)備完成它的工作后,它就會(huì)產(chǎn)生一個(gè)中斷(默認(rèn)操作系統(tǒng)已經(jīng)開啟中斷),它通過在總線上聲明已分配的信號來實(shí)現(xiàn)此目的。主板上的中斷控制器芯片會(huì)檢測到這個(gè)信號,然后執(zhí)行中斷操作。

如果在中斷前沒有其他中斷操作阻塞的話,中斷控制器將立刻對中斷進(jìn)行處理,如果在中斷前還有其他中斷操作正在執(zhí)行,或者有其他設(shè)備發(fā)出級別更高的中斷信號的話,那么這個(gè)設(shè)備將暫時(shí)不會(huì)處理。在這種情況下,該設(shè)備會(huì)繼續(xù)在總線上置起中斷信號,直到得到 CPU 服務(wù)。

為了處理中斷,中斷控制器在地址線上放置一個(gè)數(shù)字,指定要關(guān)注的設(shè)備是哪個(gè),并聲明一個(gè)信號以中斷 CPU。中斷信號導(dǎo)致 CPU 停止當(dāng)前正在做的工作并且開始做其他事情。地址線上會(huì)有一個(gè)指向中斷向量表 的索引,用來獲取下一個(gè)程序計(jì)數(shù)器。這個(gè)新獲取的程序計(jì)數(shù)器也就表示著程序?qū)⒁_始,它會(huì)指向程序的開始處。一般情況下,陷阱和中斷從這一點(diǎn)上看使用相同的機(jī)制,并且常常共享相同的中斷向量。中斷向量的位置可以硬連線到機(jī)器中,也可以位于內(nèi)存中的任何位置,由 CPU 寄存器指向其起點(diǎn)。

中斷服務(wù)程序開始運(yùn)行后,中斷服務(wù)程序通過將某個(gè)值寫入中斷控制器的 I/O 端口來確認(rèn)中斷。告訴它中斷控制器可以自由地發(fā)出另一個(gè)中斷。通過讓 CPU 延遲響應(yīng)來達(dá)到多個(gè)中斷同時(shí)到達(dá) CPU 涉及到競爭的情況發(fā)生。一些老的計(jì)算機(jī)沒有集中的中斷控制器,通常每個(gè)設(shè)備請求自己的中斷。

硬件通常在服務(wù)程序開始前保存當(dāng)前信息。對于不同的 CPU 來說,哪些信息需要保存以及保存在哪里差別很大。不管其他的信息是否保存,程序計(jì)數(shù)器必須要被保存,這對所有的 CPU 來說都是相同的,以此來恢復(fù)中斷的進(jìn)程。所有可見寄存器和大量內(nèi)部寄存器也應(yīng)該被保存。

上面說到硬件應(yīng)該保存當(dāng)前信息,那么保存在哪里是個(gè)問題,一種選擇是將其放入到內(nèi)部寄存器中,在需要時(shí)操作系統(tǒng)可以讀出這些內(nèi)部寄存器。這種方法會(huì)造成的問題是:一段時(shí)間內(nèi)設(shè)備無法響應(yīng),直到所有的內(nèi)部寄存器中存儲(chǔ)的信息被讀出后,才能恢復(fù)運(yùn)行,以免第二個(gè)內(nèi)部寄存器重寫內(nèi)部寄存器的狀態(tài)。

第二種方式是在堆棧中保存信息,這也是大部分 CPU 所使用的方式。但是,這種方法也存在問題,因?yàn)槭褂玫亩褩2淮_定,如果使用的是當(dāng)前堆棧,則它很可能是用戶進(jìn)程的堆棧。堆棧指針甚至不合法,這樣當(dāng)硬件試圖在它所指的地址處寫入時(shí),將會(huì)導(dǎo)致致命錯(cuò)誤。如果使用的是內(nèi)核堆棧,堆棧指針是合法的并且指向一個(gè)固定的頁面,這樣的機(jī)會(huì)可能會(huì)更大。然而,切換到內(nèi)核態(tài)需要切換 MMU 上下文,并且可能使高速緩存或者 TLB 失效。靜態(tài)或動(dòng)態(tài)重新裝載這些東西將增加中斷處理的時(shí)間,浪費(fèi) CPU 時(shí)間。

精確中斷和不精確中斷

另一個(gè)問題是:現(xiàn)代 CPU 大量的采用流水線并且有時(shí)還采用超標(biāo)量(內(nèi)部并行)。在一些老的系統(tǒng)中,每條指令執(zhí)行完畢后,微程序或硬件將檢查是否存在未完成的中斷。如果存在,那么程序計(jì)數(shù)器和 PSW 將被壓入堆棧中開始中斷序列。在中斷程序運(yùn)行之后,舊的 PSW 和程序計(jì)數(shù)器將從堆棧中彈出恢復(fù)先前的進(jìn)程。

下面是一個(gè)流水線模型

 

在流水線滿的時(shí)候出現(xiàn)一個(gè)中斷會(huì)發(fā)生什么情況?許多指令正處于不同的執(zhí)行階段,中斷出現(xiàn)時(shí),程序計(jì)數(shù)器的值可能無法正確地反應(yīng)已經(jīng)執(zhí)行過的指令和尚未執(zhí)行的指令的邊界。事實(shí)上,許多指令可能部分執(zhí)行,不同的指令完成的程度或多或少。在這種情況下,程序計(jì)數(shù)器更有可能反應(yīng)的是將要被取出并壓入流水線的下一條指令的地址,而不是剛剛被執(zhí)行單元處理過的指令的地址。

在超標(biāo)量的設(shè)計(jì)中,可能更加糟糕

 

每個(gè)指令都可以分解成為微操作,微操作有可能亂序執(zhí)行,這取決于內(nèi)部資源(如功能單元和寄存器)的可用性。當(dāng)中斷發(fā)生時(shí),某些很久以前啟動(dòng)的指令可能還沒開始執(zhí)行,而最近執(zhí)行的指令可能將要馬上完成。在中斷信號出現(xiàn)時(shí),可能存在許多指令處于不同的完成狀態(tài),它們與程序計(jì)數(shù)器之間沒有什么關(guān)系。

使機(jī)器處于良好狀態(tài)的中斷稱為精確中斷(precise interrupt)。這樣的中斷具有四個(gè)屬性:

  • PC (程序計(jì)數(shù)器)保存在一個(gè)已知的地方
  • PC 所指向的指令之前所有的指令已經(jīng)完全執(zhí)行
  • PC 所指向的指令之后所有的指令都沒有執(zhí)行
  • PC 所指向的指令的執(zhí)行狀態(tài)是已知的

不滿足以上要求的中斷稱為 不精確中斷(imprecise interrupt),不精確中斷讓人很頭疼。上圖描述了不精確中斷的現(xiàn)象。指令的執(zhí)行時(shí)序和完成度具有不確定性,而且恢復(fù)起來也非常麻煩。

相關(guān)鏈接

https://pineight.com/ds/block/

https://www.computerhope.com/jargon/i/iodevice.htm

https://en.wikipedia.org/wiki/Memory_module

《現(xiàn)代操作系統(tǒng)》第四版

https://en.wikipedia.org/wiki/Preamble

https://en.wikipedia.org/wiki/Word_(computer_architecture)

責(zé)任編輯:武曉燕 來源: Java建設(shè)者
相關(guān)推薦

2012-11-12 13:46:56

手機(jī)超級計(jì)算機(jī)

2015-09-30 11:22:19

計(jì)算機(jī)大數(shù)據(jù)

2021-04-20 19:15:51

瀏覽器網(wǎng)絡(luò)URL

2009-06-12 14:24:48

計(jì)算機(jī)專業(yè)就業(yè)畢業(yè)生

2021-02-22 13:14:00

計(jì)算機(jī)編程技術(shù)

2012-10-23 15:11:05

2023-11-20 22:14:16

計(jì)算機(jī)視覺人工智能

2019-04-30 09:45:12

計(jì)算機(jī)互聯(lián)網(wǎng) 技術(shù)

2023-10-11 18:30:39

Web系統(tǒng)程序

2010-11-01 10:33:07

2023-03-02 07:49:38

2012-11-26 10:33:09

2018-03-07 17:47:16

藍(lán)屏計(jì)算機(jī)死機(jī)

2011-04-22 15:35:32

配置編輯

2019-09-10 12:58:03

電腦編程語言硬件

2023-11-23 13:47:26

系統(tǒng)計(jì)算機(jī)

2012-02-29 10:02:59

IBM量子計(jì)算機(jī)超級計(jì)算機(jī)

2014-11-25 15:36:47

雙主機(jī)計(jì)算機(jī)ITM

2015-07-15 11:14:42

2020-09-24 10:45:52

計(jì)算機(jī)互聯(lián)網(wǎng) 技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號