日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OS- -I/O之I/O设备

發(fā)布時(shí)間:2024/4/11 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OS- -I/O之I/O设备 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OS- -I/O之I/O設(shè)備

文章目錄

  • OS- -I/O之I/O設(shè)備
    • 一、I/O
      • 1.I/O設(shè)備
        • 塊設(shè)備
        • 塊設(shè)備的缺點(diǎn)
        • 字符設(shè)備
        • 設(shè)備控制器
        • 內(nèi)存映射I/O
        • 內(nèi)存映射I/O的優(yōu)點(diǎn)和缺點(diǎn)
        • 直接內(nèi)存訪問
        • DMA工作原理
        • 中斷
        • 精確中斷和不精確中斷

一、I/O

  • 我們之前提到了操作系統(tǒng)的三個(gè)抽象,它們分別是進(jìn)程、地址空間和文件,除此之外,操作系統(tǒng) 還要控制所有的I/O設(shè)備。
  • 操作系統(tǒng)必須向設(shè)備發(fā)送命令,捕捉中斷并處理錯(cuò)誤。它還應(yīng)該在設(shè)備 和操作系統(tǒng)的其余部分之間提供一個(gè)簡(jiǎn)單易用的接口。
  • 不同的人對(duì)I/O。硬件的理解也不同。
  • 對(duì)于電子工程師而言,I/O硬件就是芯片、導(dǎo)線、電源和其他組成 硬件的物理設(shè)備。
  • 而我們程序員眼中的I/O其實(shí)就是硬件提供給軟件的接口,比如硬件接受到的命
    令、執(zhí)行的操作以及反饋的錯(cuò)誤。

1.I/O設(shè)備

  • 什么是I/O設(shè)備? I/O設(shè)備又叫做輸入/輸出設(shè)備,它是人類用來(lái)和計(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è)塊都較為對(duì)立,能夠獨(dú)立的進(jìn)行讀寫。

  • 常見的塊設(shè)備有硬 盤、藍(lán)光光盤、USB盤

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

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

  • 基于給定固態(tài)存儲(chǔ)器的塊設(shè)備比基于相同類型的存儲(chǔ)器的字節(jié)尋址要慢一些,因?yàn)楸仨氃趬K的開頭開始 讀取或?qū)懭搿?/strong>
  • 所以,要讀取該塊的任何部分,必須尋找到該塊的開始,讀取整個(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傳入和傳出信號(hào)的系統(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娑翁?hào)。
  • eax, ecx等是一般用途的寄存器,因?yàn)槟憧梢詿o(wú)限制地使用它們。
  • 例如,你不能移動(dòng)ds,但是可以移動(dòng)eax, ebxo
  • 通用目的寄存器比如有:eax、ecx、edx、ebx、esi、edi、ebp、esp
  • 特殊目的寄存器比如有:cs、ds、ss、es、fs、gs、eips flag
  • 每個(gè)設(shè)備控制器都會(huì)有一個(gè)應(yīng)用程序與之對(duì)應(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è)磁道512字節(jié)。
  • 然而,實(shí)際從驅(qū)動(dòng)出來(lái)的卻是一個(gè)串行的比特流,從一個(gè)前導(dǎo)符(preamble)開 始,然后是一個(gè)扇區(qū)中的4096位,最后是一個(gè)校驗(yàn)和 或ECC (錯(cuò)誤碼,Error-Correcting Code)。
  • 前導(dǎo)符是在對(duì)磁盤進(jìn)行格式化的時(shí)候?qū)懮先サ?#xff0c;它包括柱面數(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é)塊沒有錯(cuò)誤后,再將它復(fù)制到內(nèi)存 中。

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

  • 每個(gè)控制器都會(huì)有幾個(gè)寄存器用來(lái)和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),來(lái)供系統(tǒng)進(jìn)行讀寫。
  • 例如,在屏幕 上顯示一個(gè)像素的常規(guī)方法是使用一個(gè)視頻RAM,這一RAM基本上只是一個(gè)數(shù)據(jù)緩沖區(qū),用來(lái)供程 序和操作系統(tǒng)寫入數(shù)據(jù)。
  • 那么問題來(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ú)法訪問它(只有操作系統(tǒng)可以訪 問)。使用特殊的I/O指令像是
IN REG,PORT
  • CPU可以讀取控制寄存器PORT的內(nèi)容并將結(jié)果放在CPU寄存器REG中。類似的,使用
OUT PORT,REG
  • CPU可以將REG的內(nèi)容寫到控制寄存器中。
  • 大多數(shù)早期計(jì)算機(jī),包括幾乎所有大型主機(jī),如舊M 360 及其所有后續(xù)機(jī)型,都是以這種方式工作的。
  • 控制寄存器是一個(gè)處理器寄存器而改變或控制的一般行為CPU或其他數(shù)字設(shè)備。控制寄存器執(zhí)行 的常見任務(wù)包括中斷控制,切換尋址模式,分頁(yè)控制和協(xié)處理器控制。

  • 在這一方案中,內(nèi)存地址空間和I/O地址空間是不相同的,如下圖所示

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

  • 第二個(gè)方法是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)。在舊M PC兼容機(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)地址既 分配給內(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è)備控制寄存器,那么訪問這些寄存器需要使用匯編代碼,因 為在C或C++中不存在執(zhí)行IN和OUT指令的方法。調(diào)用這樣的過程增加了 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/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)存模塊(memory modules)和所有的I/O設(shè)備都 必須檢查所有的內(nèi)存引用來(lái)推斷出誰(shuí)來(lái)進(jìn)行響應(yīng)。
  • 什么是內(nèi)存模塊?在計(jì)算中,存儲(chǔ)器模塊是其上安裝有存儲(chǔ)器集成電路的印刷電路板。


  • 讓每個(gè)內(nèi)存模塊和I/O設(shè)備查看每個(gè)地址是簡(jiǎn)單易行的。然而,現(xiàn)代個(gè)人計(jì)算機(jī)的趨勢(shì)是專用的高速內(nèi)存總線

如下圖所示:

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

如下圖所示:

  • 在內(nèi)存映射機(jī)器上使用單獨(dú)的內(nèi)存總線的麻煩之處在于,I/O設(shè)備無(wú)法通過內(nèi)存總線查看內(nèi)存地址,因 此它們無(wú)法對(duì)其進(jìn)行響應(yīng)。
  • 此外,必須采取特殊的措施使內(nèi)存映射I/O工作在具有多總線的系統(tǒng)上。
  • 一 種可能的 方法是首先將全部?jī)?nèi)存引用發(fā)送到內(nèi)存,如果內(nèi)存響應(yīng)失敗,CPU再嘗試其他總線
  • 第二種設(shè)計(jì)是在內(nèi)存總線上放一個(gè)探查設(shè)備,放過所有潛在指向所關(guān)注的I/O設(shè)備的地址。此處的問 題是,I/O設(shè)備可能無(wú)法以內(nèi)存所能達(dá)到的速度處理請(qǐng)求。
  • 第三種可能的設(shè)計(jì)是在內(nèi)存控制器中對(duì)地址進(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ì)都有支持它和反對(duì)它的論據(jù),所以折中和權(quán)衡是不可避 免的。

直接內(nèi)存訪問

  • 無(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) 存訪問(Direct Memory Access)的方案。
  • 為了簡(jiǎn)化,我們假設(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ū)懙絀/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控制器的寄存器對(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控制器通過在總線上發(fā)出一個(gè)讀請(qǐng)求到磁盤控制器而發(fā)起DMA傳送,這是第二步
  • 這個(gè)讀請(qǐng)求 就像其他讀請(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í),DMA控制器會(huì)打斷CPU并告訴它傳輸已經(jīng)完成了。操作系統(tǒng)開 始運(yùn)行時(shí),它不會(huì)把磁盤塊拷貝到內(nèi)存中,因?yàn)樗呀?jīng)在內(nèi)存中了。
  • 不同DMA控制器的復(fù)雜程度差別很大。最簡(jiǎn)單的DMA控制器每次處理一次傳輸,就像上面描述的那 樣。
  • 更為復(fù)雜的情況是一次同時(shí)處理很多次傳輸,這樣的控制器內(nèi)部具有多組寄存器,每個(gè)通道一組寄 存器。
  • 在傳輸每一個(gè)字之后,DMA控制器就決定下一次要為哪個(gè)設(shè)備提供服務(wù)。DMA控制器可能被設(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è)模式中,DMA控制器請(qǐng)求傳送一個(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)行的是長(zhǎng)時(shí)間的突發(fā)傳送,有可能將 CPU和其他設(shè)備阻塞很長(zhǎng)的時(shí)間。
  • 在我們討論的這種模型中,有時(shí)被稱為飛越模式(fly-by mode) , DMA控制器會(huì)告訴設(shè)備控制器把 數(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ù)制(通過事先對(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控制器必須使用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)開啟中斷),它通過在總線 上聲明已分配的信號(hào)來(lái)實(shí)現(xiàn)此目的。主板上的中斷控制器芯片會(huì)檢測(cè)到這個(gè)信號(hào),然后執(zhí)行中斷操作。
  • 如果在中斷前沒有其他中斷操作阻塞的話,中斷控制器將立刻對(duì)中斷進(jìn)行處理,如果在中斷前還有其他 中斷操作正在執(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ī)器中,也可以位于內(nèi)存中的任何位置,由CPU寄存器指向 其起點(diǎn)。
  • 中斷服務(wù)程序開始運(yùn)行后,中斷服務(wù)程序通過將某個(gè)值寫入中斷控制器的I/O端口來(lái)確認(rèn)中斷。告訴它 中斷控制器可以自由地發(fā)出另一個(gè)中斷。
  • 通過讓CPU延遲響應(yīng)來(lái)達(dá)到多個(gè)中斷同時(shí)到達(dá)CPU涉及到 競(jìng)爭(zhēng)的情況發(fā)生。一些老的計(jì)算機(jī)沒有集中的中斷控制器,通常每個(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)前信息,那么保存在哪里是個(gè)問題:
  • 一種選擇是將其放入到內(nèi)部寄存器中,在 需要時(shí)操作系統(tǒng)可以讀出這些內(nèi)部寄存器。這種方法會(huì)造成的問題是:一段時(shí)間內(nèi)設(shè)備無(wú)法響應(yīng),直到 所有的內(nèi)部寄存器中存儲(chǔ)的信息被讀出后,才能恢復(fù)運(yùn)行,以免第二個(gè)內(nèi)部寄存器重寫內(nèi)部寄存器的狀 態(tài)。
  • 第二種方式是在堆棧中保存信息,這也是大部分CPU所使用的方式。但是,這種方法也存在問題,因 為使用的堆棧不確定,如果使用的是當(dāng)前堆棧,則它很可能是用戶進(jìn)程的堆棧。堆棧指針甚至不合 法,這樣當(dāng)硬件試圖在它所指的地址處寫入時(shí),將會(huì)導(dǎo)致致命錯(cuò)誤。
  • 如果使用的是內(nèi)核堆棧,堆棧指針 是合法的并且指向一個(gè)固定的頁(yè)面,這樣的機(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ù)器的值可能無(wú)法正確地反應(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í)行的指令可能將要馬 上完成。在中斷信號(hào)出現(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ù)起來(lái)也非常麻煩。

總結(jié)

以上是生活随笔為你收集整理的OS- -I/O之I/O设备的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。