SCSI 總線和協(xié)議
一. I/O 通路
在計(jì)算機(jī)中,一個(gè)或多個(gè)CPU 處理在CPU緩存或主存儲(chǔ)器(RAM:Random Access Memory)中的數(shù)據(jù)。 CPU緩存或主存儲(chǔ)器是非??斓钠骷?,但是斷電就不能保存,價(jià)錢也比較昂貴。 所以數(shù)據(jù)還需要放在存儲(chǔ)設(shè)備上。
通常,數(shù)據(jù)從主存儲(chǔ)器(RAM)通過系統(tǒng)總線,主機(jī)I/O 總線 和 I/O 總線移動(dòng)到磁盤或者磁帶等存儲(chǔ)設(shè)備。
1.1 系統(tǒng)總線
在計(jì)算機(jī)的核心部分,系統(tǒng)總線保證數(shù)據(jù)在CPU和主存儲(chǔ)器之間進(jìn)行快速的傳遞。 系統(tǒng)總線必須使用非常高的時(shí)鐘頻率,使得它能夠足夠快的給CPU 提供數(shù)據(jù)。 該總線的實(shí)現(xiàn)采用在主電路板上印制導(dǎo)線的形式。 出于物理性能的原因,高的系統(tǒng)速度需要短的印制導(dǎo)線。 因此,系統(tǒng)總線應(yīng)該盡可能的短一些,并且只能連接CPU和主存儲(chǔ)器。
1.2 主機(jī)I/O 總線
在現(xiàn)在計(jì)算機(jī)中,為了釋放CPU 的應(yīng)用處理負(fù)擔(dān),人們把盡可能多的任務(wù)移到諸如圖像處理器這樣的特別的處理器中。 由于上述物理上的限制條件,這些器件不可以連接到系統(tǒng)總線。 因此大多數(shù)計(jì)算機(jī)都實(shí)現(xiàn)了稱作主機(jī)I/O總線的第二個(gè)總線。 橋接芯片提供在系統(tǒng)總線和主機(jī)I/O總線之間的連接。 PCI(Peripheral Component Interconnection:外圍互聯(lián)設(shè)備)是當(dāng)前最廣泛使用的實(shí)現(xiàn)主機(jī)I/O 總線的技術(shù)。
1.3 I/O 總線
設(shè)備驅(qū)動(dòng)器負(fù)責(zé)控制外圍設(shè)備以及與外圍設(shè)備的通信。針對(duì)存儲(chǔ)設(shè)備的設(shè)備驅(qū)動(dòng)器部分以軟件形式存在,該軟件由CPU處理。由于跟存儲(chǔ)設(shè)備通信的部分設(shè)備驅(qū)動(dòng)器幾乎總是以固件的形式實(shí)現(xiàn),該固件由特別的處理器(ASIC:Application Specific Integration Circuit)處理。 當(dāng)前這些ASIC 有的集成到主電路板(如SCSI 控制器),也有的通過附加的PCI卡連接到主板。 這些附加的卡通常被稱作控制器。 存儲(chǔ)設(shè)備通過主機(jī)總線適配器(HBA:Host Bus Adapter)或者通過在板上的控制器連接到服務(wù)器。 在控制器和外圍設(shè)備之間的通信連接叫作I/O總線。
當(dāng)前用戶I/O 總線的最重要的技術(shù)是SCSI 和光纖通道。 SCSI 定義了一種總線,該總線能夠連接16個(gè)設(shè)備(包括服務(wù)器和存儲(chǔ)設(shè)備)。 在另一方面,光纖通道定義存儲(chǔ)網(wǎng)絡(luò)的不同拓?fù)浣Y(jié)構(gòu),該存儲(chǔ)網(wǎng)絡(luò)可以連接數(shù)百萬個(gè)設(shè)備(包括服務(wù)器和存儲(chǔ)設(shè)備)。 作為替代光纖通道的其他選擇,工業(yè)界正在使用TCP/IP 和以太網(wǎng)(IP存儲(chǔ))實(shí)現(xiàn)存儲(chǔ)網(wǎng)絡(luò)。 注意的是,這些新技術(shù)都是繼續(xù)使用SCSI 協(xié)議在設(shè)備間通信。
二. 并行SCSI 總線
把磁盤和磁帶設(shè)備連接到應(yīng)用服務(wù)器或文件服務(wù)器,最常用的方法就是通過傳統(tǒng)的SCSI總線。盡管SCSI主要是一個(gè)塊協(xié)議,但這個(gè)術(shù)語也被用來指稱運(yùn)行該協(xié)議的并行線纜機(jī)制。
最初的SCSI物理層傳輸介質(zhì)是一種并行電纜,由8根數(shù)據(jù)線和一些控制線構(gòu)成。在每個(gè)發(fā)送時(shí)鐘里傳輸8位數(shù)據(jù),傳輸速率相對(duì)說來是比較高的;但是由于電氣方面的問題,使得多數(shù)SCSI設(shè)備所允許的傳輸距離被限制在15-25m左右。隨著時(shí)間的推移,SCSI并行總線的性能一直在提高,并通過提供更多的數(shù)據(jù)通路(例如采用16位數(shù)據(jù)線和32位數(shù)據(jù)線)和更快的時(shí)鐘,得到了更大的帶寬。
并行總線存在的一個(gè)問題是飄移現(xiàn)象。如果把一組并行的多位數(shù)據(jù)同時(shí)發(fā)出,每條數(shù)據(jù)線上的傳輸延遲會(huì)出現(xiàn)差異,導(dǎo)致各個(gè)位不會(huì)在精確的同一時(shí)間到達(dá)目的地。所謂飄移指的是一個(gè)時(shí)間窗口,所有的數(shù)據(jù)位在這段分布的時(shí)間內(nèi)都能到達(dá)目的地。各個(gè)傳輸線上傳輸延遲的差別越大,飄移窗口也就越大。根據(jù)傳輸線理論,總線中每條線路的傳輸阻抗(包括容抗和感抗)跟它所處的位置有關(guān),因此,傳輸延遲是位線所處的物理位置的函數(shù)。對(duì)于給定長度的線纜,要想增加時(shí)鐘頻率,就必須減小飄移窗口,從而最小化線路間的傳輸延遲差。顯然在高頻條件下,電纜越長,飄移窗口越大。
SCSI規(guī)范的第1個(gè)版本發(fā)布于1986年。自那時(shí)以來,它被廣泛應(yīng)用于服務(wù)器和高檔PC中,其速率由最初的4MBps發(fā)展到現(xiàn)在的320MBps,而且還在提高著。
作為一種介質(zhì),SCSI定義了一個(gè)并行總線,用于數(shù)據(jù)傳輸和通信控制。總線本身可以是印制導(dǎo)線的形式,也可以是一根電纜。外部SCSI設(shè)備使用電纜以菊花鏈的形式連接到服務(wù)器上的控制器。在菊花鏈中,每個(gè)設(shè)備都跟其他設(shè)備串接。由于這個(gè)原因,外部SCSI設(shè)備典型地都有兩個(gè)SCSI連接器,可以分別連接到鏈中的前一個(gè)設(shè)備和后一個(gè)設(shè)備?,F(xiàn)在的一個(gè)SCSI總線可以連接多至16個(gè)設(shè)備。其中包括1個(gè)SCSI控制器和15個(gè)存儲(chǔ)裝置。
2.1 SCSI 類型
SCSI有三個(gè)基本規(guī)范:
SCSI-1:SCSI-1是在1986年開發(fā)的原始規(guī)范,現(xiàn)已不再使用。它規(guī)定總線寬度為8位,時(shí)鐘速度為5MHz。
SCSI-2:1994年采用,此規(guī)范包括通用指令集(CCS)——支持任何SCSI設(shè)備所必需的18個(gè)命令。在此規(guī)范中,可以選擇將時(shí)鐘速度提高一倍,達(dá)到10MHz (Fast),將總線寬度增加為原來的兩倍,即16位,將設(shè)備數(shù)增加為15個(gè)(Wide),或者同時(shí)實(shí)現(xiàn)上述兩種升級(jí)(Fast/Wide)。SCSI-2還增加了命令隊(duì)列,允許設(shè)備存儲(chǔ)命令,并從主機(jī)排列命令優(yōu)先級(jí)。
SCSI-3:此規(guī)范于1995年正式出臺(tái),包括一系列較小范圍的標(biāo)準(zhǔn)。涉及SCSI并行接口(SPI)的一組標(biāo)準(zhǔn)在SCSI-3中得到了繼續(xù)發(fā)展,SPI是SCSI設(shè)備之間的通信方式。大多數(shù)SCSI-3規(guī)范都以Ultra開頭,如Ultra for SPI規(guī)范、Ultra2 for SPI-2規(guī)范和Ultra3 for SPI-3規(guī)范。名稱中的Fast和Wide的含義與SCSI-2中的一樣。SCSI-3是當(dāng)前正在使用的標(biāo)準(zhǔn)。
雙倍總線速度、雙倍時(shí)鐘速度和SCSI-3規(guī)范的不同組合,產(chǎn)生了許多不同的SCSI規(guī)范。下表對(duì)幾種不同規(guī)范進(jìn)行了比較。很多較慢的規(guī)范已不再使用——在此列出僅作比較之用。
名稱 | 規(guī)范 | 設(shè)備數(shù)量 | 總線寬度 | 總線速度 | Mbps |
異步SCSI | SCSI-1 | 8 | 8位 | 5MHz | 4Mbps |
同步SCSI | SCSI-1 | 8 | 8位 | 5MHz | 5Mbps |
Wide | SCSI-2 | 16 | 16位 | 5MHz | 10Mbps |
Fast | SCSI-2 | 8 | 8位 | 10MHz | 10Mbps |
Fast/Wide | SCSI-2 | 16 | 16位 | 10MHz | 20Mbps |
Ultra | SCSI-3SPI | 8 | 8位 | 20MHz | 20Mbps |
Ultra/Wide | SCSI-3SPI | 8 | 16位 | 20MHz | 40Mbps |
Ultra2 | SCSI-3SPI-2 | 8 | 8位 | 40MHz | 40Mbps |
Ultra2/Wide | SCSI-3SPI-2 | 16 | 16位 | 40MHz | 80Mbps |
Ultra3 | SCSI-3SPI-3 | 16 | 16位 | 40MHz | 160Mbps |
Ultra320 | SCSI-3SPI-4 | 16 | 16位 | 80MHz | 320Mbps |
除了總線速度提高之外,Ultra320 SCSI還使用分組化數(shù)據(jù)傳輸,從而提高其效率。Ultra2也是最后一種具有“窄”(8位)總線寬度的規(guī)范。
所有這些SCSI類型都是并行的——數(shù)據(jù)通過總線同時(shí)傳輸,而不是一次傳輸一種數(shù)據(jù)。最新的SCSI類型稱為串行連接SCSI(SAS:Serial Attached SCSI),這種連接使用SCSI命令,但以串行方式傳輸數(shù)據(jù)。SAS使用點(diǎn)對(duì)點(diǎn)串行連接,以3.0千兆位每秒的速度傳輸數(shù)據(jù),每個(gè)SAS端口可以支持多達(dá)128個(gè)設(shè)備或擴(kuò)展設(shè)備。
2.2 SCSI的控制器、設(shè)備和電纜
SCSI控制器在SCSI總線上的所有其他設(shè)備和計(jì)算機(jī)之間進(jìn)行協(xié)調(diào)。SCSI控制器也稱為主機(jī)適配器,控制器既可以是插入可用插槽的卡,也可以內(nèi)置在主板上。SCSI BIOS(Basic Input output System)也在控制器上。它是一個(gè)小型ROM或閃存芯片,包含訪問和控制總線上的設(shè)備所需的軟件。
每個(gè)SCSI設(shè)備都必須具有唯一的標(biāo)識(shí)符(ID)才能正常工作。例如,如果總線能夠支持16個(gè)設(shè)備,通過硬件或軟件設(shè)置指定的設(shè)備ID的范圍為0-15。SCSI 控制器本身必須使用其中一個(gè)ID,通常是最高的那一個(gè),而將其他ID留給總線上的其他15個(gè)設(shè)備使用。
內(nèi)部設(shè)備通過帶狀電纜連接到SCSI控制器。外部SCSI設(shè)備使用一條粗的圓形電纜,以菊花鏈形式連接到控制器(串行連接SCSI設(shè)備使用SATA電纜)。在菊花鏈中,每個(gè)設(shè)備都依次連接到下一個(gè)設(shè)備。因此,外部SCSI設(shè)備通常具有兩個(gè)SCSI連接器——分別連接前后兩個(gè)設(shè)備。
電纜本身通常由三層構(gòu)成:
(1)內(nèi)層:保護(hù)性最好的層,包含實(shí)際發(fā)送的數(shù)據(jù)。
(2)介質(zhì)層:包含向設(shè)備發(fā)送控制命令的線路。
(2)外層:包含傳輸奇偶校驗(yàn)信息的線路,這些信息可確保數(shù)據(jù)的正確性。
不同SCSI標(biāo)準(zhǔn)使用不同的連接器,這些連接器通常不兼容,通常使用50、68或80針。SAS使用較小的SATA兼容連接器。
一旦總線上的全部設(shè)備安裝完畢,而且分配了各自的ID,則總線的每一端都必須閉合。下面介紹如何執(zhí)行這一操作。
2.3 終接器
如果SCSI總線保持開放狀態(tài),沿總線發(fā)送的電信號(hào)會(huì)反射回來,從而干擾設(shè)備和SCSI控制器之間的通信。解決方法是終結(jié)總線,用電阻電路閉合每一端。如果總線同時(shí)支持內(nèi)部和外部設(shè)備,則必須終結(jié)每個(gè)系列的最后一個(gè)設(shè)備。
SCSI 終結(jié)的類型主要可分為兩類:被動(dòng)(無源)和主動(dòng)(有源)。
(1)被動(dòng)(無源)終結(jié)通常用于在標(biāo)準(zhǔn)時(shí)鐘速度下運(yùn)行、且設(shè)備到控制器的距離小于1米的SCSI系統(tǒng)。
(2)主動(dòng)(有源)終結(jié)用于Fast SCSI系統(tǒng),或設(shè)備到SCSI控制器的距離大于1米的系統(tǒng)。
SCSI還使用三種不同類型的總線信令,這也會(huì)影響終結(jié)。電脈沖以信令的方式在線路上發(fā)送。
(1)單端(SE:Single-ended):控制器生成信號(hào),并通過單條數(shù)據(jù)線將信號(hào)傳送至總線上的所有設(shè)備。每個(gè)設(shè)備都會(huì)產(chǎn)生信號(hào)損失。因此,信號(hào)會(huì)很快開始衰減,由此SE SCSI的傳輸距離被限制為約3米以內(nèi)。PC中普遍采用SE信令。
(2)高壓差動(dòng)(HVD:High-Voltage Differential):HVD常用于服務(wù)器,它以串聯(lián)方式發(fā)送信號(hào),采用一條數(shù)據(jù)高壓線和一條數(shù)據(jù)低壓線。SCSI總線上的每個(gè)設(shè)備都有信號(hào)收發(fā)器。控制器與設(shè)備通信時(shí),總線沿途的設(shè)備接收信號(hào)并轉(zhuǎn)發(fā)信號(hào),直至信號(hào)到達(dá)目標(biāo)設(shè)備為止。這樣,控制器和設(shè)備之間的允許距離可顯著增加,可達(dá)25米。
(3)低壓差動(dòng)(LVD:Low-Voltage Differential):LVD是HVD的同類技術(shù),工作原理非常相似。兩者之間的差異在于,LVD的收發(fā)器更小,并且內(nèi)置于每個(gè)設(shè)備的SCSI適配器中。這使得LVD SCSI設(shè)備的價(jià)格更合理,并且LVD使用更少的電量就可以通信。缺點(diǎn)在于最大距離僅為HVD的一半——12米。
HVD和LVD通常都使用被動(dòng)終結(jié)器,即使設(shè)備和控制器之間的距離遠(yuǎn)大于1米也是如此。這是因?yàn)槭瞻l(fā)器可以確保信號(hào)足夠強(qiáng),能從總線的一端傳輸?shù)搅硪欢恕?/p>
三. SCSI 協(xié)議
在SNIA 共享存儲(chǔ)模型中,SCSI 負(fù)責(zé)從上層接收請(qǐng)求并轉(zhuǎn)發(fā),或者從并行設(shè)備獲取數(shù)據(jù)并轉(zhuǎn)發(fā)。
例如:有一個(gè)應(yīng)用程序向操作系統(tǒng)發(fā)出對(duì)磁盤設(shè)備的寫請(qǐng)求。 在SCSI協(xié)議層,這個(gè)寫請(qǐng)求被看成是特定數(shù)量的數(shù)據(jù)塊以協(xié)議的形式傳遞到指定位置的命令。作為操作系統(tǒng)和存儲(chǔ)設(shè)備之間的一個(gè)中介,SCSI 協(xié)議既不規(guī)定數(shù)據(jù)塊如何組織,也不規(guī)定怎樣把數(shù)據(jù)塊放到磁盤上。 在SCSI把數(shù)據(jù)塊發(fā)送到目的地時(shí),目標(biāo)方可能是單個(gè)物理磁盤,也可能是把數(shù)據(jù)塊在多個(gè)物理盤上分條存放的RAID 控制器。 SCSI 協(xié)議的責(zé)任,就是在確認(rèn)寫操作已經(jīng)正確完成后向操作系統(tǒng)報(bào)告成功,而不管在磁盤上物理存儲(chǔ)是如何配置以及寫操作是如何執(zhí)行的。
3.1 SCSI 域
SCSI 設(shè)備是在一定的環(huán)境中運(yùn)行的。 通常需要有多個(gè)SCSI設(shè)備才能形成這樣的環(huán)境。 SCSI 設(shè)備間的運(yùn)行環(huán)境也稱為SCSI域。在這個(gè)域內(nèi),生成和發(fā)送SCSI命令和任務(wù)管理請(qǐng)求的SCSI端口稱為SCSI發(fā)起方,接收和處理SCSI命令,根據(jù)請(qǐng)求執(zhí)行任務(wù)管理的端口稱為SCSI目標(biāo)方。
SCSI 域的組成包括SCSI設(shè)備,設(shè)備內(nèi)的SCSI 發(fā)起方和目標(biāo)方以及提供數(shù)據(jù)交接的總線。 SCSI總線連接了掛在它上面的所有SCSI設(shè)備。我們可以把一個(gè)實(shí)際的SCSI應(yīng)用系統(tǒng)抽象為一個(gè)SCSI域,域中有多個(gè)SCSI設(shè)備,而且?guī)CSI驅(qū)動(dòng)器的計(jì)算機(jī)也可以被看成是一個(gè)SCSI設(shè)備。
盡管可以允許有多個(gè)SCSI設(shè)備接在同一條總線上,SCSI協(xié)議實(shí)際定義的是設(shè)備間一對(duì)一的數(shù)據(jù)交換,即同一時(shí)刻在SCSI總線上只允許有兩個(gè)設(shè)備互相交換數(shù)據(jù)。因?yàn)?,SCSI上的各個(gè)設(shè)備是以分時(shí)共享的方式使用總線的。
在一個(gè)實(shí)際的SCSI域中,必須至少有一個(gè)發(fā)起方和1個(gè)目標(biāo)方,考慮到主機(jī)對(duì)數(shù)據(jù)存儲(chǔ)的需求,配置了SCSI控制器的主機(jī)至少有1個(gè)SCSI發(fā)起方。而磁盤設(shè)備主要是提供存儲(chǔ)和數(shù)據(jù)服務(wù),一般都有目標(biāo)發(fā)。
3.2 SCSI 協(xié)議模型
為了便于實(shí)現(xiàn)和理解SCSI的各個(gè)協(xié)議,SCSI 采取了分層結(jié)構(gòu)。 SCSI 大致可分為三層,即SCSI應(yīng)用層,SCSI 傳輸層和SCSI 互連層。 SCSI中的各個(gè)具體協(xié)議一般都位于其中的某一層,可以可能跨越兩層。
在應(yīng)用層,SCSI 體系結(jié)構(gòu)把發(fā)起方(主機(jī))和目標(biāo)方(如磁盤)的通信定義為客戶/服務(wù)器交換。SCSI 客戶位于主機(jī)中,代表上層應(yīng)用程序,文件系統(tǒng)和操作系統(tǒng)I/O請(qǐng)求。 SCSI 設(shè)備服務(wù)器位于目標(biāo)設(shè)備中,對(duì)請(qǐng)求做出響應(yīng)。 客戶/服務(wù)器請(qǐng)求和響應(yīng)通過某種形式的底層協(xié)議進(jìn)行傳輸。
在傳輸協(xié)議層,SCSI 設(shè)備之間通過一系列的命令實(shí)現(xiàn)數(shù)據(jù)的傳送,大致分成三個(gè)階段:命令的執(zhí)行,數(shù)據(jù)的傳送和命令的確認(rèn)。
SCSI 互聯(lián)層完成SCSI設(shè)備對(duì)總線的連接以及發(fā)送方和目標(biāo)方的選擇等功能。
3.3 尋址機(jī)制
為了對(duì)連接在總線上的設(shè)備尋址,SCSI 協(xié)議引入了SCSI設(shè)備ID 和邏輯單元號(hào)LUN. 在SCSI 總線上的每個(gè)設(shè)備都必須有一個(gè)唯一的ID,其中包括服務(wù)器中的主機(jī)總線適配器也擁有設(shè)備ID. 取決域SCSI標(biāo)準(zhǔn)的版本,每條總線最多可允許有8個(gè)或者16個(gè)設(shè)備ID。
諸如RAID 磁盤子系統(tǒng)和磁帶庫這樣的存儲(chǔ)設(shè)備可能包括若干個(gè)子設(shè)備,如虛擬磁盤,磁帶驅(qū)動(dòng)器和介質(zhì)更換器等。 因此SCSI 引入了邏輯單元號(hào),以便于對(duì)大的設(shè)備中的子設(shè)備進(jìn)行尋址。 另外一個(gè)服務(wù)器可能配置了多個(gè)SCSI控制器,從而就可能有多條SCSI總線。 因此,操作系統(tǒng)用一個(gè)三元描述標(biāo)識(shí)一個(gè)SCSI目標(biāo): 總線/目標(biāo)設(shè)備/邏輯單元號(hào)
傳統(tǒng)的SCSI 適配卡連接單個(gè)總線,相應(yīng)的只具有一個(gè)總線號(hào)。 在引入存儲(chǔ)網(wǎng)絡(luò)之后,每個(gè)光纖通道HBA(Host Bus Adapter)或iSCSI(Internet SCSI)網(wǎng)卡也都連接一條總線,分配一個(gè)總線號(hào),在他們之間依靠不同的總線號(hào)加以區(qū)分。
目標(biāo)設(shè)備標(biāo)識(shí)在一條總線菊花鏈上的單個(gè)設(shè)備,邏輯單元號(hào)則表示一個(gè)目標(biāo)設(shè)備中的一個(gè)子設(shè)備。 通常,單個(gè)物理磁盤只具有一個(gè)邏輯單元號(hào),而RAID磁盤陣列雖然也只有一個(gè)目標(biāo)設(shè)備,但卻有多個(gè)邏輯單元號(hào)。
在一條總線上各個(gè)設(shè)備具有不同的優(yōu)先級(jí)。起初的SCSI 協(xié)議只允許有8個(gè)目標(biāo)設(shè)備ID,規(guī)定ID7 具有最高權(quán)限。后來版本的SCSI 協(xié)議允許有16個(gè)不同的目標(biāo)設(shè)備ID。出于兼容性的考慮,從7到0的目標(biāo)設(shè)備依然具有高優(yōu)先級(jí),而從15到8的設(shè)備ID具有較低優(yōu)先級(jí)。
設(shè)備(服務(wù)器和存儲(chǔ)設(shè)備)在可以通過SCSI 總線發(fā)送數(shù)據(jù)之前必須預(yù)定總線(仲裁)。 在總線的仲裁期間,具有最高優(yōu)先權(quán)的目標(biāo)設(shè)備總能獲勝。 在總線負(fù)載重的情況下,這可能導(dǎo)致具有較低優(yōu)先級(jí)的設(shè)備總是不被允許發(fā)送數(shù)據(jù),因此,SCSI的仲裁過程是不平等的。
出于配置和管理的需要,操作系統(tǒng)使用總線號(hào)/目標(biāo)設(shè)備ID/邏輯單元號(hào)三元組來標(biāo)識(shí)一個(gè)SCSI目標(biāo),然而用戶和應(yīng)用程序所看到的只是一個(gè)邏輯標(biāo)識(shí)符,如D盤。 因此在總線號(hào)/目標(biāo)設(shè)備ID/邏輯單元號(hào)和邏輯盤符之間存在著一個(gè)映射,提供在物理設(shè)備和上層文件系統(tǒng)之間不同表示形式的轉(zhuǎn)換。
3.4 交互方式
SCSI協(xié)議把發(fā)起方(主機(jī))和目標(biāo)方(例如磁盤)之間的交互定義為客戶/服務(wù)器方式。應(yīng)用客戶位于主機(jī)中,代表上層應(yīng)用程序、文件系統(tǒng)和操作系統(tǒng)的I/0請(qǐng)求。設(shè)備服務(wù)器位于目標(biāo)設(shè)備中,它響應(yīng)客戶的請(qǐng)求。請(qǐng)求和響應(yīng)通過某種形式的下層分布設(shè)施進(jìn)行傳輸,該分布設(shè)施稱作分布子系統(tǒng),可以是并行電纜,也可以是光纖通道協(xié)議或iSCSI。
一個(gè)發(fā)起方可能會(huì)有多個(gè)請(qǐng)求同時(shí)發(fā)給目標(biāo)方。多個(gè)請(qǐng)求產(chǎn)生應(yīng)用客戶的多個(gè)實(shí)例,從而在設(shè)備服務(wù)器上產(chǎn)生多個(gè)事務(wù)。
發(fā)起方在其發(fā)往一個(gè)或多個(gè)目標(biāo)的多個(gè)請(qǐng)求正在被相關(guān)的設(shè)備服務(wù)器處理的時(shí)候,需要能夠執(zhí)行上下文交換 (ContextSwitching),即具有從一個(gè)任務(wù)快速切換到另一個(gè)任務(wù)的能力。例如,作為一個(gè)發(fā)起方的文件服務(wù)器可以向一個(gè)目標(biāo)方發(fā)送一個(gè)寫請(qǐng)求。‘當(dāng)該文件服務(wù)器在等待這個(gè)目標(biāo)方準(zhǔn)備好緩沖區(qū)以接收數(shù)據(jù)的那段時(shí)間內(nèi),可以切換到另一個(gè)掛起的任務(wù),例如處理已經(jīng)到達(dá)的對(duì)先前的另一個(gè)請(qǐng)求的響應(yīng),從而提高運(yùn)行效率,最大化吞吐量。如果SCSI任務(wù)只能依次串行地執(zhí)行,那么等待每個(gè)寫或讀請(qǐng)求完成的時(shí)間就都被白白地浪費(fèi)了。一般來說,上下文交換是由主機(jī)適配卡完成的,可以是并行SCSI,也可以是光纖通道或iSCSI。
由于SCSI體系結(jié)構(gòu)模型是層次化的,因此它對(duì)主機(jī)I/0請(qǐng)求的處理可以獨(dú)立于底層的分發(fā)子系統(tǒng)。一個(gè)應(yīng)用客戶主機(jī)可以處理涉及不同種類的目標(biāo)設(shè)備的I/0操作,例如一個(gè)應(yīng)用服務(wù)器可以有直接附接的SCSI目標(biāo)方,也可以有通過千兆位速率接口連接的串行SCSI目標(biāo)方。
在SCSI發(fā)起方和目標(biāo)方之間讀寫數(shù)據(jù)是通過SCSI命令、分發(fā)請(qǐng)求、分發(fā)操作和響應(yīng)來完成的。SCSI命令和參數(shù)在CDB(CommandDescriptorBlock,命令描述塊)中指定。作為交互示例,在執(zhí)行對(duì)磁盤的SCSI寫過程時(shí),在發(fā)起方(例如主機(jī)總線適配器)創(chuàng)建一個(gè)應(yīng)用客戶,該客戶發(fā)送SCSI命令請(qǐng)求給目標(biāo)方,令其準(zhǔn)備緩沖區(qū)以接收數(shù)據(jù)。目標(biāo)設(shè)備服務(wù)器在其緩沖區(qū)準(zhǔn)備好之后,發(fā)送一個(gè)數(shù)據(jù)分發(fā)操作請(qǐng)求進(jìn)行響應(yīng)。接著,發(fā)送方就執(zhí)行分發(fā)操作,開始發(fā)送數(shù)據(jù)塊。依賴于底層的分發(fā)子系統(tǒng),數(shù)據(jù)塊可能按字節(jié)并行傳輸(例如并行SCSI總線),也可能以分段成幀的形式串行傳輸(例如光纖通道或iSCSI)。
從應(yīng)用程序或操作系統(tǒng)的角度看,寫操作只是一個(gè)事務(wù)。但實(shí)際上,對(duì)應(yīng)一個(gè)寫操作,發(fā)送方和目標(biāo)方可能要進(jìn)行多次的分發(fā)請(qǐng)求和分發(fā)操作的交互,才能把命令請(qǐng)求的所有數(shù)據(jù)都發(fā)送給目標(biāo)方。
在一次讀操作中,SCSI命令塊遵循相反的數(shù)據(jù)分發(fā)請(qǐng)求和確認(rèn)序列,然而由于是發(fā)起方發(fā)出讀命令,所以命令就假定自己已經(jīng)準(zhǔn)備好了緩沖區(qū)以接收第1批數(shù)據(jù)塊。在讀寫事務(wù)的每個(gè)階段所發(fā)送的數(shù)據(jù)塊數(shù)量,由發(fā)起方和目標(biāo)方根據(jù)對(duì)方的緩沖區(qū)容量協(xié)商決定。例如,高性能磁盤陣列一般都能提供較大的緩沖區(qū),可以完成大規(guī)模的數(shù)據(jù)傳送,從而提高了產(chǎn)品性能。
3.5 SCSI總線信號(hào)
SCSI在物理信號(hào)的基礎(chǔ)上定義了一組總線信號(hào)。這些信號(hào)可劃分為數(shù)據(jù)信號(hào)和控制信號(hào)兩類。它們都是二進(jìn)制信號(hào),并且只有“真”和“偽”兩個(gè)穩(wěn)定狀態(tài)。其中有指示總線已經(jīng)被占用的“BSY”信號(hào),有清除并重新設(shè)置SCSI總線的“RST”信號(hào)等。
下面對(duì)這些信號(hào)的名稱和功能逐一進(jìn)行介紹。
1.BSY(Busy,忙)信號(hào)
該信號(hào)是“或態(tài)”信號(hào),表示已經(jīng)有設(shè)備占用總線。
2.SEL(Select,選擇)信號(hào)
該信號(hào)是“或態(tài)”信號(hào),由發(fā)起方用以選擇目標(biāo)方,或者由目標(biāo)方用以重新選擇發(fā)起方。
3.C/D(Control/Data,控制/數(shù)據(jù))信號(hào)
該信號(hào)由目標(biāo)方驅(qū)動(dòng),表示在數(shù)據(jù)總線上傳送的是數(shù)據(jù)信號(hào)還是控制信號(hào)。該信號(hào)處于真狀態(tài)時(shí)表示控制信號(hào)。
4.I/O(Input/Output,輸入輸出)信號(hào)
該信號(hào)由目標(biāo)方驅(qū)動(dòng),控制數(shù)據(jù)在數(shù)據(jù)總線上的移動(dòng)方向。當(dāng)I/0信號(hào)為“真”時(shí)表示是對(duì)發(fā)起方的輸入,數(shù)據(jù)由目標(biāo)方向發(fā)起方傳送;若I/0信號(hào)為“偽”,則表示數(shù)據(jù)由發(fā)起方向目標(biāo)方傳送。該信號(hào)也被用來區(qū)分選擇和重選階段。
5.MSG(Message,通信)信號(hào)
該信號(hào)由目標(biāo)方驅(qū)動(dòng),表示總線處于信息傳送的通信階段。
6.REQ(Request,請(qǐng)求)信號(hào)
該信號(hào)由目標(biāo)方驅(qū)動(dòng),表示有信息傳輸請(qǐng)求,請(qǐng)求一個(gè)REQ/ACK數(shù)據(jù)傳送握手過程。
7.ACK(Acknowledge,應(yīng)答)信號(hào)
該信號(hào)由發(fā)起方驅(qū)動(dòng),表示對(duì)REQ信號(hào)的應(yīng)答。
8.ATN(Attention,提醒)信號(hào)
該信號(hào)由發(fā)起方驅(qū)動(dòng),指示一個(gè)提醒信息,表明發(fā)起方有一個(gè)消息要給目標(biāo)方發(fā)送。
9.RST(Reset,重置)信號(hào)
該信號(hào)是“或態(tài)”信號(hào),表示一個(gè)硬件重置狀態(tài),指示總線進(jìn)入重新設(shè)置階段,清除所有使用總線的SCSI設(shè)備。
10.DB(DataBus,數(shù)據(jù)總線)信號(hào)
DB信號(hào)有兩種,分別是用于8位數(shù)據(jù)總線的DB(7-0,P)和用于16位數(shù)據(jù)總線的DB(l5~O,P)。這些信號(hào)都用于傳送信息的值,它們包括數(shù)據(jù)比特信號(hào),加上奇偶檢驗(yàn)比特信號(hào)。
由于在SCSI總線上掛有多個(gè)設(shè)備,一些控制信號(hào)可能同時(shí)被多個(gè)SCSI設(shè)備驅(qū)動(dòng)。這些信號(hào)被稱作“或態(tài)”信號(hào)。對(duì)于“或態(tài)”信號(hào),SCSI設(shè)備不會(huì)主動(dòng)將其驅(qū)動(dòng)成“偽”,而是依賴總線終接器,在總線上的所有設(shè)備都沒有驅(qū)動(dòng)該信號(hào)時(shí)將其設(shè)置成“偽。”只要有1個(gè)或多個(gè)設(shè)備驅(qū)動(dòng)該信號(hào),該信號(hào)就是“真”。與“或態(tài)”信號(hào)相對(duì)照的是“非或態(tài)”信號(hào)。對(duì)于“非或態(tài)”信號(hào),SCSI設(shè)備可以將其驅(qū)動(dòng)成“偽”。
3.6 SCSI 總線的使用階段
根據(jù)對(duì)總線不同的使用,可以把SCSI總線狀態(tài)劃分成8個(gè)不同的階段:空閑階段,仲裁階段,選擇階段,重選階段,命令階段,數(shù)據(jù)階段,狀態(tài)階段和通信階段。
其中命令階段,數(shù)據(jù)階段,狀態(tài)階段和通信階段都設(shè)計(jì)信息在總線的傳送,所以又稱為:信息傳送階段。
除了空閑階段外,其他階段的總線都被SCSI設(shè)備占用。
3.6.1. 總線空閑階段
總線空閑表明沒有一個(gè)設(shè)備在使用SCSI總線,也表示在此狀態(tài)下,SCSI設(shè)備如果需要,可以使用總線。SCSI設(shè)備需要在總線上的SEL信號(hào)和BSY信號(hào)都是“偽”之后,才可以檢測(cè)總線是否處于空閑狀態(tài)。
作為例子,SCSI總線可能在下列情況下進(jìn)入空閑狀態(tài):
1.RST信號(hào)被設(shè)置;
2.不成功的總線選擇或重選;
3.目標(biāo)設(shè)備解除連接;
4.目標(biāo)設(shè)備命令完成。
一旦一個(gè)SCSI設(shè)備確定總線處于空閑階段,它就可以申請(qǐng)總線仲裁,從而進(jìn)入仲裁階段。
3.6.2. 總線仲裁階段
在SCSI總線上的設(shè)備必須先獲得總線連接權(quán),然后才可以進(jìn)行其他的操作。在默認(rèn)條件下,看似掛在總線上的設(shè)備在邏輯上是與總線斷開的,沒有參與總線上的活動(dòng)。SCSI設(shè)備只有在需要進(jìn)行數(shù)據(jù)傳輸和設(shè)備狀態(tài)報(bào)告時(shí)才會(huì)申請(qǐng)總線連接權(quán)。SCSI設(shè)備一旦得到了總線連接權(quán),就將在發(fā)起方和目標(biāo)方之間形成一個(gè)物理連接的通道,然后就可以進(jìn)行數(shù)據(jù)傳輸。
一般情況下,總線的獲取與對(duì)目標(biāo)方的選擇都由發(fā)起方完成。為了更加高效地使用總線,在某些情況下,例如在有較長時(shí)間的CPU處理等待或設(shè)備存取等待時(shí),需要釋放總線以供其他設(shè)備使用。在等待的相關(guān)任務(wù)完成后,再重新進(jìn)行總線仲裁和連接權(quán)獲取操作,以繼續(xù)進(jìn)行暫停的工作。因此,有時(shí)目標(biāo)方也可以執(zhí)行總線操作和連接權(quán)獲取操作,準(zhǔn)確地講,是再獲取操作。
SCSI總線上的設(shè)備的優(yōu)先級(jí)是由它的地址即SCSI ID決定的。在窄SCSI中的ID范圍是0-7,對(duì)應(yīng)的優(yōu)先級(jí)是從1到8。在寬SCSI中的ID范圍是O~l5,其中對(duì)應(yīng)IDO~7的優(yōu)先級(jí)是從9到16遞增,而對(duì)應(yīng)ID8~l5的優(yōu)先級(jí)是從1到8遞增。在這里,我們用較大的數(shù)值表示較高的優(yōu)先級(jí),因此,ID7具有最高優(yōu)先級(jí)。在窄SCSI中,ID 0具有最低優(yōu)先級(jí);在寬SCSI中,ID8具有最低優(yōu)先級(jí)。
SCSI總線上的ID數(shù)目是與SCSI數(shù)據(jù)總線寬度一致的,因此,窄SCSI有8個(gè)ID,寬SCSI有16個(gè)ID。在窄 SCSI中的8根數(shù)據(jù)線的編號(hào)是從0到7,在寬SCSI中的16根數(shù)據(jù)線的編號(hào)是從0到15。有趣的是,具有某個(gè)編號(hào)的數(shù)據(jù)線上的信號(hào),還被用來表示具有對(duì)應(yīng)號(hào)碼ID的SCSI設(shè)備是否在執(zhí)行選擇或相關(guān)操作。例如當(dāng)數(shù)據(jù)總線中的數(shù)據(jù)線DB(2)在某個(gè)特定的階段被驅(qū)動(dòng)成真時(shí),就可以表示其ID為2的設(shè)備已經(jīng)在總線上執(zhí)行了選擇或相關(guān)操作。
在SCSI域中,主機(jī)是存儲(chǔ)設(shè)備的主要使用者,且對(duì)存儲(chǔ)的響應(yīng)要求較高,因此通常主機(jī)的優(yōu)先級(jí)最高,其分配的ID值也最大,在窄SCSI中是ID7,在寬SCSI中是IDl5。
總線仲裁就是在可能同時(shí)有多個(gè)設(shè)備請(qǐng)求的情況下,最終只給予其中的一個(gè)SCSI設(shè)備總線控制權(quán)的過程。SCSI設(shè)備在檢測(cè)到“總線空閑”并等待一個(gè)時(shí)延后即可以把總線置成BSY,并把與它的SCSIID對(duì)應(yīng)的數(shù)據(jù)線信號(hào)置為“真”,開始總線仲裁申請(qǐng)。
在等待1個(gè)時(shí)延后,該SCSI設(shè)備需檢測(cè)在數(shù)據(jù)總線上是否有更高優(yōu)先級(jí)的SCSIID也為“真”。如果總線上確有更高優(yōu)先級(jí)的設(shè)備在進(jìn)行總線申請(qǐng),則該SCSI設(shè)備不再置BSY和對(duì)應(yīng)的數(shù)據(jù)線為“真”。放棄總線仲裁申請(qǐng),直到下一次“總線空閑”;否則,該設(shè)備就獲得了總線控制權(quán),并由該設(shè)備把SEL信號(hào)置為“真”。同時(shí),總線上的其他SCSI設(shè)備則檢測(cè)到SEL信號(hào)為“真”后,不再置BSY信號(hào)和對(duì)應(yīng)的數(shù)據(jù)線為“真”,放棄總線仲裁申請(qǐng)。為了保證確實(shí)已經(jīng)獲得了總線控制權(quán),該設(shè)備在置SEL信號(hào)為“真”后、傳送其他信號(hào)前,需要有一定的時(shí)延。
在總線仲裁階段結(jié)束時(shí),總線上有BSY、SEL和與獲得總線的SCSI設(shè)備的ID,其對(duì)應(yīng)的數(shù)據(jù)線的信號(hào)為“真”。
3.6.3. 選擇階段
在選擇階段,得到總線使用權(quán)的SCSI設(shè)備在總線上選擇目標(biāo)設(shè)備,以便隨后可以向該目標(biāo)設(shè)各發(fā)送諸如讀和寫這樣的命令。這個(gè)階段主要是完成對(duì)具有特定SCSIID的設(shè)備的選擇,其相關(guān)協(xié)議的定義主要是在SCSI體系結(jié)構(gòu)的互連層。需要注意的是,邏輯單元號(hào)LUN的尋址是邏輯單元通過SCSI傳輸層協(xié)議完成的,不在互連層。與LUN編址相關(guān)的協(xié)議在傳輸協(xié)議層描述。
贏得仲裁的SCSI設(shè)備在把BSY和SEL信號(hào)置成“真”,經(jīng)過一小段時(shí)延后,即可進(jìn)入選擇階段。作為發(fā)起方,贏得仲裁的SCSI設(shè)備不可以把1/0信號(hào)置成“真”。在此階段,發(fā)起方需要把與自己的SCSIID對(duì)應(yīng)的數(shù)據(jù)線的信號(hào)和對(duì)應(yīng)所要選擇的目標(biāo)設(shè)備的SCSIID的數(shù)據(jù)線的信號(hào)置成“真”,經(jīng)過一小段時(shí)延,再把BSY信號(hào)置成“偽”,然后等待目標(biāo)方的響應(yīng)。
例如,SCSI ID為6的主機(jī)把對(duì)應(yīng)自己的ID的數(shù)據(jù)線DB(6)和對(duì)應(yīng)目標(biāo)設(shè)備的ID(=6)的數(shù)據(jù)線DB(0)置成“真”后,數(shù)據(jù)總線上信號(hào)值的狀態(tài)將如下所示。
DS(0)DS(1)DS(2)DS(3)DS(4)DS(5)DS(6)DS(7)
10 0 0 0 0 10
此時(shí),只有兩個(gè)數(shù)據(jù)線的信號(hào)值是“真”。如果有多于兩個(gè)的數(shù)據(jù)線為“真”,則目標(biāo)方認(rèn)為有誤。目標(biāo)方在SEL和對(duì)應(yīng)它的ID的數(shù)據(jù)線的信號(hào)為“真”并且BSY和I/0信號(hào)為“偽”的情況下,就可以確定它自己已經(jīng)被選為目標(biāo)設(shè)備。此時(shí),目標(biāo)方設(shè)備應(yīng)該重新把BSY信號(hào)置成“真”。發(fā)起方在檢測(cè)到BSY為“真”的信號(hào)后,就把SEL信號(hào)置成“偽”。特別需要注意的是,在該階段結(jié)束時(shí),BSY信號(hào)是由目標(biāo)方置位的。
3.6.4. 重選階段
在SCSI目標(biāo)設(shè)備忙于處理其內(nèi)部事務(wù)(通常是對(duì)于執(zhí)行對(duì)存儲(chǔ)數(shù)據(jù)的讀或?qū)懖僮?期間,它可以在等待操作(比如把存儲(chǔ)在設(shè)備中的數(shù)據(jù)讀入緩沖區(qū)或把暫存在緩沖區(qū)的數(shù)據(jù)寫入緩沖區(qū))完成時(shí)釋放總線供其他設(shè)備使用,并在操作完成后重新申請(qǐng)對(duì)總線的使用權(quán)。因此,重選階段也發(fā)生在“總線仲裁階段”之后。但與選擇階段不同,重選階段由目標(biāo)方啟動(dòng),重新建立由發(fā)送方啟動(dòng)成功但被目標(biāo)方掛斷的連接。
在目標(biāo)設(shè)備釋放了總線之后,BSY和SEL信號(hào)處于被置成“真”的狀態(tài)。此時(shí)日標(biāo)設(shè)備通過把I/0信號(hào)置成“真”使自己成為贏得對(duì)總線使用權(quán)的一方。在重選階段,目標(biāo)方也需要把與自已的SCSIID對(duì)應(yīng)的數(shù)據(jù)線的信號(hào)和對(duì)應(yīng)發(fā)送方設(shè)備的SCSIID的數(shù)據(jù)線的信號(hào)置成“真”,經(jīng)過一段短的時(shí)延,再把BSY信號(hào)置成“偽”,然后等待發(fā)起方的響應(yīng)。
發(fā)起方在SEL、I/0和對(duì)應(yīng)它的ID的數(shù)據(jù)線的信號(hào)為“真”并且BSY為“偽”的情況下,就可以確定它自己已經(jīng)被重選。被重選的發(fā)起方可以通過查看數(shù)據(jù)總線來驗(yàn)證重迭的目標(biāo)方的SCSIID。然后,發(fā)起方設(shè)各重新把BSY信號(hào)置成“真”。目標(biāo)方在檢測(cè)到BSY為“真”的信號(hào)后,它也執(zhí)行把BSY驅(qū)動(dòng)成“真”的操作,并把SEL信號(hào)置成“偽”。
被重選的發(fā)起方在檢測(cè)到SEL信號(hào)為“偽”后,它就把BSY置成“偽”,而目標(biāo)設(shè)備則繼續(xù)把BSY設(shè)置成“真”,直到它放棄對(duì)總線的使用權(quán)為止。這樣,在該階段結(jié)束時(shí),信號(hào)的狀態(tài)與選擇階段一樣,也是由目標(biāo)方設(shè)置的BSY信號(hào)。
3.6.5. 信號(hào)傳送階段
命令階段、數(shù)據(jù)階段、狀態(tài)階段和通信階段被組合在一起作為信息傳送階段,因?yàn)樗鼈兌急挥脕硗ㄟ^數(shù)據(jù)總線傳送數(shù)據(jù)或控制信息。SCSI使用C/D、I/0和MSG信號(hào)區(qū)分不同的信息傳送階段以及對(duì)應(yīng)的信息傳輸方向。目標(biāo)方驅(qū)動(dòng)這3個(gè)信號(hào),控制從一個(gè)階段到另一個(gè)階段的轉(zhuǎn)變。發(fā)起方可以通過把ATN信號(hào)置成“真”請(qǐng)求一個(gè)“通信出”階段,而目標(biāo)方可以通過釋放MSG、C/D、I/0和BSY信號(hào)引入總線空閑階段。信息傳送階段使用一個(gè)或多個(gè)REQ/ACK握手過程控制信息傳送。每個(gè)REQ/ACK握手過程允許傳送1個(gè)或多個(gè)字節(jié)的信息。因?yàn)樾畔魉碗A段一定是在選擇階段或重選階段之后,所以不改變BSY和SEL信號(hào)。事實(shí)上,在該階段,BSY持續(xù)為“真”,SEL信號(hào)持續(xù)為“偽”。
表2-2示出了MSG、C/D和I/0信號(hào)值與階段名及信息傳輸方向之間的關(guān)系。其中的“出”和“入”是相對(duì)子發(fā)送方設(shè)備而言的,且數(shù)據(jù)傳輸方向由I/0信號(hào)確定。
表2-2MSG、C/D和1/0信號(hào)值與階段名及信息傳輸方向之間的關(guān)系
MSG | CID | 1/0 | 階段 | 具體階段 | 傳輸方向 | |||
1 | 0 | 0 | *(未用) | |||||
1 | 0 | 1 | *(末用) | |||||
1 | 1 | 0 | 通信 | 通信出 | 從發(fā)送方到目標(biāo)方 | |||
1 | 1 | 1 | 通信 | 通信入 | 從目標(biāo)方到發(fā)送方 | |||
0 | 0 | 0 | 數(shù)據(jù) | 數(shù)據(jù)出 | 從發(fā)送方到目標(biāo)方 | |||
0 | 0 | 1 | 數(shù)據(jù) | 數(shù)據(jù)入 | 從目標(biāo)方到發(fā)送方 | |||
0 | 1 | 0 | 命令 | 從發(fā)送方到目標(biāo)方 | ||||
0 | 1 | 1 | 狀態(tài) | 從目標(biāo)方到發(fā)送方 | ||||
注釋:0=偽,1=真,*=保留未來定義
命令階段允許目標(biāo)方請(qǐng)求發(fā)起方傳送命令信息。在命令階段的REQ/ACK握手過程中,目標(biāo)方把C/D信號(hào)置成“真”,把I/0信號(hào)和MSG信號(hào)置成“偽”。
數(shù)據(jù)階段包括“數(shù)據(jù)入”階段和“數(shù)據(jù)出”階段。
(1)“數(shù)據(jù)入”階段允許目標(biāo)方請(qǐng)求把數(shù)據(jù)從目標(biāo)方傳送給發(fā)起方。在“數(shù)據(jù)入”階段的REQ/ACK握手過程中,目標(biāo)方把I/0信號(hào)置成“真”,把C/D信號(hào)和MSG信號(hào)置成“偽”。
(2)“數(shù)據(jù)出”階段允許目標(biāo)方請(qǐng)求把數(shù)據(jù)從發(fā)起方傳送到目標(biāo)方。在“數(shù)據(jù)出”階段的REQ/ACK握手過程中,目標(biāo)方把C/D信號(hào)、I/0信號(hào)和MSG信號(hào)都置成“真”。
狀態(tài)階段允許目標(biāo)方請(qǐng)求把狀態(tài)信息從目標(biāo)方傳送給發(fā)起方。在狀態(tài)階段的REQ/ACK握手過程中,目標(biāo)方把C/D信號(hào)和I/0信號(hào)置成“真”,把MSG信號(hào)置成“偽”。
通信階段可以是“通信入”階段或“通信出”階段。無論是在“通信入”階段,還是在“通信出”階段,都可以傳送多條消息。傳送的第一個(gè)字節(jié)可以是單字節(jié)消息,也可以是多字節(jié)消息的首字節(jié)。在1個(gè)通信階段可以傳送多個(gè)多字節(jié)消息。
“通信入”階段允許目標(biāo)方請(qǐng)求把消息從目標(biāo)方發(fā)送給發(fā)起方。在“通信入”階段的REQ/ACK握手過程中,目標(biāo)方把C/D信號(hào)、I/0信號(hào)和MSG信號(hào)都置成“真”。
“通信出”階段允許目標(biāo)方請(qǐng)求把消息從發(fā)起方傳送到目標(biāo)方。目標(biāo)方在響應(yīng)發(fā)起方建立的提醒條件時(shí)調(diào)用“通信出”階段。在“通信出”階段的REQ/ACK握手過程中,目標(biāo)方把C/D信號(hào)和MSG信號(hào)置成“真”,把I/0信號(hào)置成“偽”。
3.7 異步傳輸和同步傳輸
與傳統(tǒng)網(wǎng)絡(luò)的數(shù)據(jù)包傳送方式不同,SCSI 基于REQ/ACK 信號(hào)控制數(shù)據(jù)傳輸?shù)倪^程。 根據(jù)REQ和ACK信號(hào)控制與數(shù)據(jù)總線置位時(shí)間的差別,信息傳輸又可分為異步傳輸和同步傳輸兩個(gè)列別。 而且,無論傳輸?shù)姆较蛉绾危畔⒌膫鬏敹际怯蒖EQ信號(hào)開始,并且REQ信號(hào)都是由目標(biāo)方控制和發(fā)送的。
1. 異步信息傳輸
異步傳輸方式可用于數(shù)據(jù)階段的數(shù)據(jù)傳輸,也可用于命令、狀態(tài)和通信階段的信息傳輸。首先,信息傳輸?shù)姆较蚴怯蒊/O信號(hào)決定的。如果I/O信號(hào)為“真”,那么信息是由目標(biāo)方向發(fā)起方傳輸。在此情況下,為了傳送信息,目標(biāo)方先把數(shù)據(jù)線DB(7/15-0,P)信號(hào)置成對(duì)應(yīng)想要傳送的二進(jìn)制數(shù)位序列的值,然后把REQ信號(hào)置成“真”。發(fā)起方在檢測(cè)到REQ為“真”時(shí),讀取數(shù)據(jù)總線的值,然后把ACK信號(hào)置成“真”。當(dāng)目標(biāo)方檢測(cè)到ACK為“真”時(shí),它就可以改變或取消放置在數(shù)據(jù)總線上的值,并把REQ置成“偽”。發(fā)起方在檢測(cè)到REQ置成“偽”時(shí)把ACK也置成“偽”。當(dāng)目標(biāo)方檢測(cè)到ACK為“偽”時(shí),總線上就完成了一次數(shù)據(jù)傳輸,并可進(jìn)行下一次數(shù)據(jù)傳輸。
在異步傳輸方式中,每個(gè)REQ/ACK握手過程傳送1個(gè)(對(duì)于窄SCSI)或2個(gè)字節(jié)(對(duì)于寬SCSI)的信息。特別需要注意的是,在此方式中,目標(biāo)方在置REQ信號(hào)后,必須持續(xù)地把數(shù)據(jù)線DB(7/l5~O,P)置成對(duì)應(yīng)所要傳送的二進(jìn)制數(shù)位序列的值,直到它檢測(cè)到ACK為真為止。
如果I/O信號(hào)為“偽”,那么信息是由發(fā)起方向目標(biāo)方傳輸。在此情況下,目標(biāo)方通過把REQ置成“真”來請(qǐng)求信息。發(fā)起方驅(qū)動(dòng)DB(7/l5~O,P)到它需要發(fā)送的二進(jìn)制數(shù)位序列的值,然后把ACK置成“真”。此后,繼續(xù)把DB(7/l5~O,P)信號(hào)置成這個(gè)二進(jìn)制數(shù)位序列的值,直到REQ變成“偽”為止。目標(biāo)方則是在檢測(cè)到ACK變成“真”時(shí),讀DB(7/l5~O,P)的值,然后把REQ置成“偽”。發(fā)起方在檢測(cè)到REQ變成“偽”時(shí),它可以改變或取消放置在數(shù)據(jù)總線上的值,并把ACK置成“偽”。
此后,目標(biāo)方可以通過把REQ置成“真”,繼續(xù)請(qǐng)求信息。
2. 同步數(shù)據(jù)傳輸
同步數(shù)據(jù)傳輸只在數(shù)據(jù)階段使用,并且是在目標(biāo)方和發(fā)起方之間建立同步數(shù)據(jù)傳輸協(xié)定之后使用。
與異步傳輸中的規(guī)則相同,當(dāng)I/0信號(hào)為“真”時(shí),數(shù)據(jù)是由目標(biāo)方向發(fā)起方傳輸。目標(biāo)方先把數(shù)據(jù)放置到數(shù)據(jù)總線上,即置DB(7/l5~O,P)對(duì)應(yīng)的線路,然后把REQ置成“真”。在同步數(shù)據(jù)傳輸中,目標(biāo)方在把REQ置成“真”后,需要把放置在DB(7/l5~O,P)上的二進(jìn)制數(shù)位序列的值保持一個(gè)指定長度的時(shí)間,但不必維持到對(duì)ACK信號(hào)變“真”的接收。這是與異步傳輸不同的一個(gè)地方。在指定長度的時(shí)間期滿后,目標(biāo)方就可以把REQ置成“偽”,并且可以改變或取消放置在數(shù)據(jù)總線上的值,然后準(zhǔn)備發(fā)送下一個(gè)數(shù)據(jù)。發(fā)起方在檢測(cè)到REQ變“真”之后一個(gè)指定長度的時(shí)間內(nèi)讀DB(7/l5~O,P)上的值,然后把ACK置成“真”作為對(duì)目標(biāo)方的響應(yīng)。
與異步傳輸一樣,在同步數(shù)據(jù)傳輸中,發(fā)起方也在接收到一個(gè)REQ并讀取了數(shù)據(jù)總線上的值之后就發(fā)送一個(gè)ACK信號(hào)。但與異步傳輸不同的是,目標(biāo)方在接收到對(duì)一個(gè)數(shù)據(jù)的ACK之前可以發(fā)送多個(gè)REQ信號(hào)。SCSI為同步數(shù)據(jù)傳輸?shù)腞EQ/ACK握手過程定義了一個(gè)稱作REQ/ACK飽和值的參數(shù),它表示在接收到ACK信號(hào)前可以發(fā)送的最大REQ信號(hào)數(shù)。如果發(fā)送的REQ數(shù)日多于接收到的ACK數(shù)目,并達(dá)到了定義的REQ/ACK飽和值,那么目標(biāo)方暫停發(fā)送REQ信號(hào)和數(shù)據(jù),直到接收到下一個(gè)ACK為止。這在原理上與傳統(tǒng)網(wǎng)絡(luò)中的流控制類似。
當(dāng)I/O信號(hào)為“偽”時(shí),數(shù)據(jù)是由發(fā)起方向目標(biāo)方傳輸。發(fā)起方每次接收到一個(gè)REQ信號(hào)就發(fā)送一次數(shù)據(jù)。目標(biāo)方先把REQ置成“真”。發(fā)起方檢測(cè)到REQ變“真”后把要發(fā)送的數(shù)據(jù)放置到數(shù)據(jù)總線上,即置DB(7/l5~O,P)對(duì)應(yīng)的線路,然后把ACK置成“真”。接著發(fā)送方需要在一個(gè)指定長度的時(shí)間內(nèi)保持在總線上放置的數(shù)據(jù)不變,并繼續(xù)把ACK置成“真”。在指定的時(shí)間期滿后,發(fā)起方可以把ACK置成“偽”,并且可以改變或取消放置在數(shù)據(jù)總線上的值。目標(biāo)方在檢測(cè)到ACK信號(hào)變“真”后,在指定的ACK保持為“真”的時(shí)間內(nèi)讀取數(shù)據(jù)總線上的數(shù)據(jù),并把REQ置成“偽”。
此后,目標(biāo)方可以通過把REQ再置成“真”繼續(xù)請(qǐng)求信息。
3.8 SCSI 命令描述塊
在互連層完成SCSI設(shè)備對(duì)總線的連接,以及發(fā)送方和目標(biāo)方的選擇的基礎(chǔ)上,傳輸層協(xié)議執(zhí)行實(shí)際的數(shù)據(jù)傳輸。傳輸層提供了兩類服務(wù),一是命令的執(zhí)行和確認(rèn);二是數(shù)據(jù)的傳送。命令的執(zhí)行是在總線進(jìn)入命令階段后,發(fā)起方通過命令描述塊(command description block,CDB)向目標(biāo)方發(fā)送具體的命令。命令的確認(rèn)是在總線進(jìn)入通信 (Message)階段后,發(fā)起方接收由目標(biāo)方發(fā)送的命令執(zhí)行確認(rèn)信息。數(shù)據(jù)的傳送則是在數(shù)據(jù)階段(數(shù)據(jù)出或數(shù)據(jù)入)進(jìn)行的。傳輸協(xié)議的運(yùn)行過程包括發(fā)送命令、傳輸數(shù)據(jù)和對(duì)命令執(zhí)行的確認(rèn)。SCSI基礎(chǔ)命令規(guī)范 SPC(SCSIPrimaryCommands,SCSI基礎(chǔ)命令)定義了CDB的標(biāo)準(zhǔn)。
除了基本命令外,SPC還定義了所有類型的SCSI目標(biāo)方設(shè)各都可以使用的管理參數(shù),如診斷參數(shù)和日志參數(shù)等。
發(fā)起方對(duì)存儲(chǔ)設(shè)備的實(shí)際操作是通過向目標(biāo)方發(fā)送一個(gè)命令描述塊來完成的。在一些情況下,在一個(gè)命令描述塊之后可能還有一些參數(shù)要傳給目標(biāo)方,按照具體的協(xié)定,這些更多的參數(shù)是在命令描述塊后的“數(shù)據(jù)出”階段發(fā)送的。命令描述塊有定長和不定長兩種格式,而定長格式的命令描述塊又有6、10、12或16字節(jié)不同的長度規(guī)定。
命令描述塊由編號(hào)從0~5的6個(gè)字節(jié)組成。下面介紹其中各個(gè)段的內(nèi)容。
1.操作碼
操作碼是所有命令描述塊都有的,它總是被放在命令描述塊的開頭一個(gè)字節(jié)。正如其名字所言,操作碼定義CDB的具體操作。8比特在理論上共有256個(gè)可能的操作碼。實(shí)際上其中有一些是保留碼,日前尚未定義。操作碼的8個(gè)二進(jìn)制位又分為兩部分:5-7位是組代碼,指示該命令具體屬于哪個(gè)命令組,它決定CDB的長度,如“000”為組“0”,表示6個(gè)字節(jié)的CDB命令組,0-4位則是具體的命令代碼。
2.混雜CDB信息
該參數(shù)表示與具體的CDB相關(guān)的信息,其中一個(gè)例子是表示邏輯設(shè)備號(hào),尋址在SCSI目標(biāo)設(shè)備中的一個(gè)邏輯單元。對(duì)應(yīng)一個(gè)SCSIID的設(shè)備可以有多個(gè)邏輯單元,所以邏輯單元擴(kuò)展了SCSI總線可訪問的設(shè)備數(shù)目,使得目標(biāo)方設(shè)各上可以有多個(gè)可被訪問的設(shè)備而只占用一個(gè)有效的SCSIID。對(duì)一個(gè)邏輯單元的實(shí)際訪問是通過該邏輯單元的一個(gè)特定的編號(hào),即邏輯單元號(hào)實(shí)現(xiàn)的。
3.邏輯塊地址
該地址是邏輯單元(比如磁盤)中的起始操作塊的位置。在6字節(jié)的CDB中,有21位的邏輯塊地址。SCSI把邏輯單元、卷或分區(qū)抽象成塊的數(shù)組,每一塊都有一個(gè)邏輯地址,編號(hào)從0開始。對(duì)SCSI存儲(chǔ)設(shè)備的每一次讀/寫操作都是針對(duì)一組連續(xù)的邏輯塊進(jìn)行的,因而需要指出起始?jí)K的邏輯地址。
4.傳送長度
該長度表示命令所請(qǐng)求的傳送量,通常是塊數(shù)。在有些類別的CDB中也可能是字節(jié)數(shù)。0表示不需要傳送數(shù)據(jù)。
5.參數(shù)表長度
有些命令還需要更多的參數(shù),這些參數(shù)由客戶提供,定義在“數(shù)據(jù)出”緩沖區(qū)中。參數(shù)表長度就表示需要傳送到存儲(chǔ)設(shè)備的這類參數(shù)的長度,0表示不需要傳遞參數(shù)。
6.分配長度
分配長度表示應(yīng)用客戶為“數(shù)據(jù)入”緩沖區(qū)分配的最大長度,根據(jù)具體的CDB類別,可能是字節(jié)數(shù),也可能是塊數(shù)。應(yīng)用客戶通常使用該“數(shù)據(jù)入”緩沖區(qū)接收特殊信息,如日志數(shù)據(jù)、診斷數(shù)據(jù)等。如果傳送的信息量超過了分配長度表示的最大值,則相關(guān)設(shè)備不應(yīng)再傳,并使用狀態(tài)階段返回特定的狀態(tài)信息。
7.控制碼
它是所有CDB格式的最后一個(gè)字節(jié)。在其中有一些特殊的域,如已經(jīng)定義的一個(gè)NACA位。在一些情況下,一個(gè)命令的執(zhí)行會(huì)以“檢查條件(CheckCondition)”狀態(tài)中止,它表明在命令執(zhí)行過程中出現(xiàn)了錯(cuò)誤或異常。 有些命令執(zhí)行的錯(cuò)誤或異常不會(huì)影響其他命令的執(zhí)行,也不需要作善后的恢復(fù)處理,而另一些命令執(zhí)行的錯(cuò)誤或異常則可能導(dǎo)致命令組中的其他命令被異常中止,需要專門的命令對(duì)其做善后處理,并要求存儲(chǔ)設(shè)各在完成善后處理工作之前不再處理該用戶的其他命令。為了區(qū)分這兩種不同的情況,也為了讓應(yīng)用客戶能夠事先聲明哪些命令執(zhí)行的錯(cuò)誤或異常需要善后處理,SCSI允許應(yīng)用客戶在CDB的控制碼中設(shè)置NACA位,請(qǐng)求存儲(chǔ)設(shè)備在命令執(zhí)行以“檢查條件”狀態(tài)中止時(shí)建立“自動(dòng)跟隨”條件(Condition),從而允許應(yīng)用客戶在隨后的善后處理命令中把新(New)任務(wù)的屬性設(shè)置成自動(dòng)跟隨(AutoContingentAllegiance,ACA)。
3.9 SCSI 的讀操作和寫操作過程
1. SCSI的讀操作過程
如果計(jì)算機(jī)要從存儲(chǔ)設(shè)備上讀取文件或數(shù)據(jù),那么無論數(shù)據(jù)的大小如何,都至少要經(jīng)歷一個(gè)SCSI的讀操作過程。當(dāng)然,操作系統(tǒng)需首先將用戶的讀取操作通過SCSII/0的應(yīng)用程序編程接口(ApplicationProgrammingInterface,API)轉(zhuǎn)化為SCSI的讀操作,并在操作完成后通過相應(yīng)的API返回響應(yīng)的值。
在SCSI域內(nèi),這個(gè)操作在傳輸層被簡單地描述成5個(gè)主要過程:
(1)發(fā)起方通過CDB發(fā)送SCSI的讀命令。
(2)目標(biāo)方接收到該命令,通過設(shè)備管理器在指定的邏輯單元中執(zhí)行該命令請(qǐng)求的操作。
(3)目標(biāo)方以字節(jié)為單位向發(fā)起方傳送數(shù)據(jù)。
(4)在數(shù)據(jù)傳輸完畢后,目標(biāo)方向發(fā)起方發(fā)送命令完成的報(bào)告。
(5)發(fā)起方接收到命令完成的響應(yīng)。
當(dāng)然,這些過程是建立在SCSI互連層的基礎(chǔ)上的。在第一個(gè)過程之前,SCSI總線由空閑階段進(jìn)入總線仲裁和選擇階段,完成發(fā)起方對(duì)總線使用權(quán)的獲得以及對(duì)目標(biāo)方的選擇和尋址。
在第一個(gè)過程中,目標(biāo)方發(fā)送REQ信號(hào),請(qǐng)求信息傳輸,控制總線進(jìn)入信息傳送的命令階段。目標(biāo)方通過發(fā)送方傳送的CDB獲取“讀”命令。在其后的第2個(gè)和第3個(gè)過程中,目標(biāo)方從它控制的外圍設(shè)備中讀取數(shù)據(jù)并發(fā)送到發(fā)起方。如目標(biāo)方準(zhǔn)備數(shù)據(jù)需要較長的時(shí)間,則可能有多個(gè)總線釋放、進(jìn)入空閑和重選階段的輪回。目標(biāo)方在每次完成數(shù)據(jù)傳送后,都控制總線進(jìn)入狀態(tài)階段并返回一個(gè)狀態(tài)信息。為進(jìn)一步表示讀命令的全部完成,在第四個(gè)過程中,總線進(jìn)入信息傳送的通信階段,目標(biāo)方發(fā)送“命令完成”信息,并可釋放SCSI總線的BSY信號(hào)。在第五個(gè)過程中,發(fā)起方接收到日標(biāo)方命令完成的響應(yīng),總線可恢復(fù)到空閑階段。
2. SCSI的寫操作過程
SCSI的寫操作過程與讀操作過程類似,但數(shù)據(jù)傳送的方向不同,它把數(shù)據(jù)從發(fā)送方向目標(biāo)方傳送。在發(fā)送方系統(tǒng)中有對(duì)文件做寫操作的用戶請(qǐng)求時(shí),它先通過文件系統(tǒng)查找該文件在存儲(chǔ)設(shè)備(如磁盤)上的邏輯塊地址 (LogicalBlockAddress,LBA),接著文件系統(tǒng)把該LBA連同其他一些參數(shù),如數(shù)據(jù)的指針、數(shù)據(jù)的長度以及邏輯單元號(hào)等傳遞給SCSI的API,并指示一個(gè)寫操作。例如寫6000字節(jié)到LUNO的邏輯塊地址OOOl234AB。SCSI的API則具體發(fā)送一個(gè)寫命令給LUNO,并將數(shù)據(jù)以存儲(chǔ)設(shè)備認(rèn)可的方式分批或一次性地傳遞到LUNO,直到數(shù)據(jù)全部傳輸完畢。之后,SCSI的API返回,并指示任務(wù)完成。然后,文件系統(tǒng)通知應(yīng)用程序任務(wù)完成。至此,一個(gè)文件的寫操作完成。
當(dāng)然,在數(shù)據(jù)寫操作中,仍然需要具體運(yùn)行SCSI的各個(gè)階段,并需要發(fā)送SCSI信號(hào)以及SCSI命令,如寫命令等。這些方面都與上面描述的讀操作類似,此處不再贅述。
從上面的介紹可以看出,一個(gè)簡單的數(shù)據(jù)讀或?qū)懖僮鲿?huì)涉及一系列的過程。實(shí)際上,在這些過程中,除了有應(yīng)用程序(如字處理軟件、數(shù)據(jù)庫等)為用戶提供的直接操作界面和操作系統(tǒng)給應(yīng)用程序提供的通用的系統(tǒng)功能外,還有文件系統(tǒng)、SCSIAPI、SCSI設(shè)備命令、SCSI驅(qū)動(dòng)程序、總線和存儲(chǔ)設(shè)備等多種軟硬件的參與。
評(píng)論