天天看點

SCSI 總線和協定

       I/O 技術實作在計算機和儲存設備之間的資料交換。實作從CPU 到存儲系統的I/O通路的一個中間就是SCSI(Small Computer System Interface).

一.  I/O 通路

       在計算機中,一個或多個CPU 處理在CPU緩存或主存儲器(RAM:Random Access Memory)中的資料。 CPU緩存或主存儲器是非常快的器件,但是斷電就不能儲存,價錢也比較昂貴。 是以資料還需要放在儲存設備上。

       通常,資料從主存儲器(RAM)通過系統總線,主機I/O 總線 和 I/O 總線移動到磁盤或者錄音帶等儲存設備。

1.1  系統總線

       在計算機的核心部分,系統總線保證資料在CPU和主存儲器之間進行快速的傳遞。 系統總線必須使用非常高的時鐘頻率,使得它能夠足夠快的給CPU 提供資料。 該總線的實作采用在主電路闆上印制導線的形式。 出于實體性能的原因,高的系統速度需要短的印制導線。 是以,系統總線應該盡可能的短一些,并且隻能連接配接CPU和主存儲器。

1.2  主機I/O 總線

       在現在計算機中,為了釋放CPU 的應用處理負擔,人們把盡可能多的任務移到諸如圖像處理器這樣的特别的處理器中。 由于上述實體上的限制條件,這些器件不可以連接配接到系統總線。 是以大多數計算機都實作了稱作主機I/O總線的第二個總線。 橋接晶片提供在系統總線和主機I/O總線之間的連接配接。 PCI(Peripheral Component Interconnection:外圍互聯裝置)是目前最廣泛使用的實作主機I/O 總線的技術。

1.3  I/O 總線

       裝置驅動器負責控制外圍裝置以及與外圍裝置的通信。針對儲存設備的裝置驅動器部分以軟體形式存在,該軟體由CPU處理。由于跟儲存設備通信的部分裝置驅動器幾乎總是以固件的形式實作,該固件由特别的處理器(ASIC:Application Specific Integration Circuit)處理。 目前這些ASIC 有的內建到主電路闆(如SCSI 控制器),也有的通過附加的PCI卡連接配接到主機闆。 這些附加的卡通常被稱作控制器。 儲存設備通過主機總線擴充卡(HBA:Host Bus Adapter)或者通過在闆上的控制器連接配接到伺服器。 在控制器和外圍裝置之間的通信連接配接叫作I/O總線。

       目前使用者I/O 總線的最重要的技術是SCSI 和光纖通道。 SCSI 定義了一種總線,該總線能夠連接配接16個裝置(包括伺服器和儲存設備)。 在另一方面,光纖通道定義存儲網絡的不同拓撲結構,該存儲網絡可以連接配接數百萬個裝置(包括伺服器和儲存設備)。 作為替代光纖通道的其他選擇,工業界正在使用TCP/IP 和以太網(IP存儲)實作存儲網絡。 注意的是,這些新技術都是繼續使用SCSI 協定在裝置間通信。

二. 并行SCSI 總線

        把磁盤和錄音帶裝置連接配接到應用伺服器或檔案伺服器,最常用的方法就是通過傳統的 SCSI總線。盡管 SCSI主要是一個塊協定,但這個術語也被用來指稱運作該協定的并行線纜機制。

       最初的 SCSI實體層傳輸媒體是一種并行電纜,由 8根資料線和一些控制線構成。在每個發送時鐘裡傳輸 8 位資料,傳輸速率相對說來是比較高的;但是由于電氣方面的問題,使得多數SCSI裝置所允許的傳輸距離被限制在 15-25 m左右。随着時間的推移,SCSI 并行總線的性能一直在提高,并通過提供更多的資料通路 (例如采用 16 位資料線和32位資料線)和更快的時鐘,得到了更大的帶寬。

       并行總線存在的一個問題是飄移現象。如果把一組并行的多位資料同時發出,每條資料線上的傳輸延遲會出現差異,導緻各個位不會在精确的同一時間到達目的地。所謂飄移指的是一個時間視窗,所有的資料位在這段分布的時間内都能到達目的地。各個傳輸線上傳輸延遲的差别越大,飄移視窗也就越大。根據傳輸線理論,總線中每條線路的傳輸阻抗 (包括容抗和感抗)跟它所處的位置有關,是以,傳輸延遲是位線所處的實體位置的函數。對于給定長度的線纜,要想增加時鐘頻率,就必須減小飄移視窗,進而最小化線路間的傳輸延遲差。顯然在高頻條件下,電纜越長,飄移視窗越大。

       SCSI 規範的第 1 個版本釋出于 1986 年。自那時以來,它被廣泛應用于伺服器和高檔 PC 中,其速率由最初的4 MBps發展到現在的 320 MBps,而且還在提高着。

       作為一種媒體,SCSI定義了一個并行總線,用于資料傳輸和通信控制。總線本身可以是印制導線的形式,也可以是一根電纜。外部 SCSI裝置使用電纜以菊花鍊的形式連接配接到伺服器上的控制器。在菊花鍊中,每個裝置都跟其他裝置串接。由于這個原因,外部 SCSI裝置典型地都有兩個 SCSI連接配接器,可以分别連接配接到鍊中的前一個裝置和後一個裝置。現在的一個 SCSI 總線可以連接配接多至 16個裝置。其中包括1 個SCSI控制器和 15個存儲裝置。

2.1 SCSI 類型

SCSI有三個基本規範:

       SCSI-1:SCSI-1是在1986年開發的原始規範,現已不再使用。它規定總線寬度為8位,時脈速度為5MHz。

       SCSI-2:1994年采用,此規範包括通用指令集(CCS)——支援任何SCSI裝置所必需的18個指令。在此規範中,可以選擇将時脈速度提高一倍,達到10MHz (Fast),将總線寬度增加為原來的兩倍,即16位,将裝置數增加為15個(Wide),或者同時實作上述兩種更新(Fast/Wide)。SCSI-2還增加了指令隊列,允許裝置存儲指令,并從主機排列指令優先級。

       SCSI-3:此規範于1995年正式出台,包括一系列較小範圍的标準。涉及SCSI并行接口(SPI)的一組标準在SCSI-3中得到了繼續發展,SPI是SCSI裝置之間的通信方式。大多數SCSI-3規範都以Ultra開頭,如Ultra for SPI規範、Ultra2 for SPI-2規範和Ultra3 for SPI-3規範。名稱中的Fast和Wide的含義與SCSI-2中的一樣。SCSI-3是目前正在使用的标準。

       雙倍總線速度、雙倍時脈速度和SCSI-3規範的不同組合,産生了許多不同的SCSI規範。下表對幾種不同規範進行了比較。很多較慢的規範已不再使用——在此列出僅作比較之用。

名稱 規範 裝置數量 總線寬度 總線速度 Mbps
異步SCSI SCSI-1 8 8位 5MHz 4Mbps
同步SCSI 5Mbps
Wide SCSI-2 16 16位 10Mbps
Fast 10MHz
Fast/Wide 20Mbps
Ultra SCSI-3SPI 20MHz
Ultra/Wide 40Mbps
Ultra2 SCSI-3SPI-2 40MHz
Ultra2/Wide 80Mbps
Ultra3 SCSI-3SPI-3 160Mbps
Ultra320 SCSI-3SPI-4 80MHz 320Mbps

       除了總線速度提高之外,Ultra320 SCSI還使用分組化資料傳輸,進而提高其效率。Ultra2也是最後一種具有“窄”(8位)總線寬度的規範。

       所有這些SCSI類型都是并行的——資料通過總線同時傳輸,而不是一次傳輸一種資料。最新的SCSI類型稱為串行連接配接SCSI(SAS:Serial Attached SCSI),這種連接配接使用SCSI指令,但以串行方式傳輸資料。SAS使用點對點串行連接配接,以3.0千兆位每秒的速度傳輸資料,每個SAS端口可以支援多達128個裝置或擴充裝置。

2.2  SCSI的控制器、裝置和電纜

       SCSI控制器在SCSI總線上的所有其他裝置和計算機之間進行協調。SCSI控制器也稱為主機擴充卡,控制器既可以是插入可用插槽的卡,也可以内置在主機闆上。SCSI  BIOS(Basic Input output System)也在控制器上。它是一個小型ROM或閃存晶片,包含通路和控制總線上的裝置所需的軟體。

       每個SCSI裝置都必須具有唯一的辨別符(ID)才能正常工作。例如,如果總線能夠支援16個裝置,通過硬體或軟體設定指定的裝置ID的範圍為0-15。SCSI 控制器本身必須使用其中一個ID,通常是最高的那一個,而将其他ID留給總線上的其他15個裝置使用。

       内部裝置通過帶狀電纜連接配接到SCSI控制器。外部SCSI裝置使用一條粗的圓形電纜,以菊花鍊形式連接配接到控制器(串行連接配接SCSI裝置使用SATA電纜)。在菊花鍊中,每個裝置都依次連接配接到下一個裝置。是以,外部SCSI裝置通常具有兩個SCSI連接配接器——分别連接配接前後兩個裝置。

電纜本身通常由三層構成:

       (1)内層:保護性最好的層,包含實際發送的資料。

       (2)媒體層:包含向裝置發送控制指令的線路。

       (2)外層:包含傳輸奇偶校驗資訊的線路,這些資訊可確定資料的正确性。

       不同SCSI标準使用不同的連接配接器,這些連接配接器通常不相容,通常使用50、68或80針。SAS使用較小的SATA相容連接配接器。

       一旦總線上的全部裝置安裝完畢,而且配置設定了各自的ID,則總線的每一端都必須閉合。下面介紹如何執行這一操作。

2.3 終接器

       如果SCSI總線保持開放狀态,沿總線發送的電信号會反射回來,進而幹擾裝置和SCSI控制器之間的通信。解決方法是終結總線,用電阻電路閉合每一端。如果總線同時支援内部和外部裝置,則必須終結每個系列的最後一個裝置。

SCSI 終結的類型主要可分為兩類:被動(無源)和主動(有源)。

(1)被動(無源)終結通常用于在标準時脈速度下運作、且裝置到控制器的距離小于1米的SCSI系統。

(2)主動(有源)終結用于Fast SCSI系統,或裝置到SCSI控制器的距離大于1米的系統。

       SCSI還使用三種不同類型的總線信令,這也會影響終結。電脈沖以信令的方式線上路上發送。

       (1)單端(SE:Single-ended):控制器生成信号,并通過單條資料線将信号傳送至總線上的所有裝置。每個裝置都會産生信号損失。是以,信号會很快開始衰減,由此SE SCSI的傳輸距離被限制為約3米以内。PC中普遍采用SE信令。

       (2)高壓差動(HVD:High-Voltage Differential):HVD常用于伺服器,它以串聯方式發送信号,采用一條資料高壓線和一條資料低壓線。SCSI總線上的每個裝置都有信号收發器。控制器與裝置通信時,總線沿途的裝置接收信号并轉發信号,直至信号到達目标裝置為止。這樣,控制器和裝置之間的允許距離可顯著增加,可達25米。

       (3)低壓差動(LVD:Low-Voltage Differential):LVD是HVD的同類技術,工作原理非常相似。兩者之間的差異在于,LVD的收發器更小,并且内置于每個裝置的SCSI擴充卡中。這使得LVD SCSI裝置的價格更合理,并且LVD使用更少的電量就可以通信。缺點在于最大距離僅為HVD的一半——12米。

      HVD和LVD通常都使用被動終結器,即使裝置和控制器之間的距離遠大于1米也是如此。這是因為收發器可以確定信号足夠強,能從總線的一端傳輸到另一端。

三.  SCSI 協定

       在SNIA 共享存儲模型中,SCSI 負責從上層接收請求并轉發,或者從并行裝置擷取資料并轉發。

       例如:有一個應用程式向作業系統發出對磁盤裝置的寫請求。 在SCSI協定層,這個寫請求被看成是特定數量的資料塊以協定的形式傳遞到指定位置的指令。作為作業系統和儲存設備之間的一個中介,SCSI 協定既不規定資料塊如何組織,也不規定怎樣把資料塊放到磁盤上。 在SCSI把資料塊發送到目的地時,目标方可能是單個實體磁盤,也可能是把資料塊在多個實體盤上分條存放的RAID 控制器。 SCSI 協定的責任,就是在确認寫操作已經正确完成後向作業系統報告成功,而不管在磁盤上實體存儲是如何配置以及寫操作是如何執行的。

3.1  SCSI 域

       SCSI 裝置是在一定的環境中運作的。 通常需要有多個SCSI裝置才能形成這樣的環境。 SCSI 裝置間的運作環境也稱為SCSI域。在這個域内,生成和發送SCSI指令和任務管理請求的SCSI端口稱為SCSI發起方,接收和處理SCSI指令,根據請求執行任務管理的端口稱為SCSI目标方。

       SCSI 域的組成包括SCSI裝置,裝置内的SCSI 發起方和目标方以及提供資料交接的總線。 SCSI總線連接配接了挂在它上面的所有SCSI裝置。我們可以把一個實際的SCSI應用系統抽象為一個SCSI域,域中有多個SCSI裝置,而且帶SCSI驅動器的計算機也可以被看成是一個SCSI裝置。

       盡管可以允許有多個SCSI裝置接在同一條總線上,SCSI協定實際定義的是裝置間一對一的資料交換,即同一時刻在SCSI總線上隻允許有兩個裝置互相交換資料。因為,SCSI上的各個裝置是以分時共享的方式使用總線的。

       在一個實際的SCSI域中,必須至少有一個發起方和1個目标方,考慮到主機對資料存儲的需求,配置了SCSI控制器的主機至少有1個SCSI發起方。而磁盤裝置主要是提供存儲和資料服務,一般都有目标發。

3.2  SCSI 協定模型

       為了便于實作和了解SCSI的各個協定,SCSI 采取了分層結構。 SCSI 大緻可分為三層,即SCSI應用層,SCSI 傳輸層和SCSI 互連層。 SCSI中的各個具體協定一般都位于其中的某一層,可以可能跨越兩層。

       在應用層,SCSI 體系結構把發起方(主機)和目标方(如磁盤)的通信定義為客戶/伺服器交換。SCSI 客戶位于主機中,代表上層應用程式,檔案系統和作業系統I/O請求。 SCSI 裝置伺服器位于目标裝置中,對請求做出響應。 客戶/伺服器請求和響應通過某種形式的底層協定進行傳輸。

       在傳輸協定層,SCSI 裝置之間通過一系列的指令實作資料的傳送,大緻分成三個階段:指令的執行,資料的傳送和指令的确認。

       SCSI 互聯層完成SCSI裝置對總線的連接配接以及發送方和目标方的選擇等功能。

3.3  尋址機制

       為了對連接配接在總線上的裝置尋址,SCSI 協定引入了SCSI裝置ID 和邏輯單元号LUN. 在SCSI 總線上的每個裝置都必須有一個唯一的ID,其中包括伺服器中的主機總線擴充卡也擁有裝置ID. 取決域SCSI标準的版本,每條總線最多可允許有8個或者16個裝置ID。

       諸如RAID 磁盤子系統和錄音帶庫這樣的儲存設備可能包括若幹個子裝置,如虛拟磁盤,錄音帶驅動器和媒體更換器等。 是以SCSI 引入了邏輯單元号,以便于對大的裝置中的子裝置進行尋址。 另外一個伺服器可能配置了多個SCSI控制器,進而就可能有多條SCSI總線。 是以,作業系統用一個三元描述辨別一個SCSI目标: 總線/目标裝置/邏輯單元号

       傳統的SCSI 适配卡連接配接單個總線,相應的隻具有一個總線号。 在引入存儲網絡之後,每個光纖通道HBA(Host Bus Adapter)或iSCSI(Internet SCSI)網卡也都連接配接一條總線,配置設定一個總線号,在他們之間依靠不同的總線号加以區分。

       目标裝置辨別在一條總線菊花鍊上的單個裝置,邏輯單元号則表示一個目标裝置中的一個子裝置。 通常,單個實體磁盤隻具有一個邏輯單元号,而RAID磁盤陣列雖然也隻有一個目标裝置,但卻有多個邏輯單元号。

       在一條總線上各個裝置具有不同的優先級。起初的SCSI 協定隻允許有8個目标裝置ID,規定ID7 具有最高權限。後來版本的SCSI 協定允許有16個不同的目标裝置ID。出于相容性的考慮,從7到0的目标裝置依然具有高優先級,而從15到8的裝置ID具有較低優先級。

       裝置(伺服器和儲存設備)在可以通過SCSI 總線發送資料之前必須預定總線(仲裁)。 在總線的仲裁期間,具有最高優先權的目标裝置總能獲勝。 在總線負載重的情況下,這可能導緻具有較低優先級的裝置總是不被允許發送資料,是以,SCSI的仲裁過程是不平等的。

       出于配置和管理的需要,作業系統使用總線号/目标裝置ID/邏輯單元号三元組來辨別一個SCSI目标,然而使用者和應用程式所看到的隻是一個邏輯辨別符,如D盤。 是以在總線号/目标裝置ID/邏輯單元号和邏輯盤符之間存在着一個映射,提供在實體裝置和上層檔案系統之間不同表示形式的轉換。

3.4  互動方式

     SCSI協定把發起方 (主機)和目标方 (例如磁盤)之間的互動定義為客戶/伺服器方式。應用客戶位于主機中,代表上層應用程式、檔案系統和作業系統的 I/0 請求。裝置伺服器位于目标裝置中,它響應客戶的請求。請求和響應通過某種形式的下層分布設施進行傳輸,該分布設施稱作分布子系統,可以是并行電纜,也可以是光纖通道協定或iSCSI。

       一個發起方可能會有多個請求同時發給目标方。多個請求産生應用客戶的多個執行個體,進而在裝置伺服器上産生多個事務。

       發起方在其發往一個或多個目标的多個請求正在被相關的裝置伺服器處理的時候,需要能夠執行上下文交換  (Context Switching),即具有從一個任務快速切換到另一個任務的能力。例如,作為一個發起方的檔案伺服器可以向一個目标方發送一個寫請求。‘當該檔案伺服器在等待這個目标方準備好緩沖區以接收資料的那段時間内,可以切換到另一個挂起的任務,例如處理已經到達的對先前的另一個請求的響應,進而提高運作效率,最大化吞吐量。如果SCSI任務隻能依次串行地執行,那麼等待每個寫或讀請求完成的時間就都被白白地浪費了。一般來說,上下文交換是由主機适配卡完成的,可以是并行 SCSI,也可以是光纖通道或iSCSI。

       由于 SCSI體系結構模型是階層化的,是以它對主機I/0請求的處理可以獨立于底層的分發子系統。一個應用客戶主機可以處理涉及不同種類的目标裝置的 I/0 操作,例如一個應用伺服器可以有直接附接的 SCSI 目标方,也可以有通過千兆位速率接口連接配接的串行SCSI 目标方。

       在SCSI發起方和目标方之間讀寫資料是通過SCSI指令、分發請求、分發操作和響應來完成的。SCSI指令和參數在 CDB (Command Descriptor Block,指令描述塊)中指定。作為互動示例,在執行對磁盤的 SCSI寫過程時,在發起方 (例如主機總線擴充卡)建立一個應用客戶,該客戶發送SCSI指令請求給目标方,令其準備緩沖區以接收資料。目标裝置伺服器在其緩沖區準備好之後,發送一個資料分發操作請求進行響應。接着,發送方就執行分發操作,開始發送資料塊。依賴于底層的分發子系統,資料塊可能按位元組并行傳輸 (例如并行 SCSI 總線),也可能以分段成幀的形式串行傳輸 (例如光纖通道或iSCSI)。

       從應用程式或作業系統的角度看,寫操作隻是一個事務。但實際上,對應一個寫操作,發送方和目标方可能要進行多次的分發請求和分發操作的互動,才能把指令請求的所有資料都發送給目标方。

       在一次讀操作中,SCSI指令塊遵循相反的資料分發請求和确認序列,然而由于是發起方發出讀指令,是以指令就假定自己已經準備好了緩沖區以接收第 1 批資料塊。在讀寫事務的每個階段所發送的資料塊數量,由發起方和目标方根據對方的緩沖區容量協商決定。例如,高性能磁盤陣列一般都能提供較大的緩沖區,可以完成大規模的資料傳送,進而提高了産品性能。

3.5  SCSI總線信号

       SCSI在實體信号的基礎上定義了一組總線信号。這些信号可劃分為資料信号和控制信号兩類。它們都是二進制信号,并且隻有“真”和“僞”兩個穩定狀态。其中有訓示總線已經被占用的“BSY”信号,有清除并重新設定SCSI總線的“RST”信号等。

下面對這些信号的名稱和功能逐一進行介紹。

1. BSY (Busy,忙)信号

    該信号是“或态”信号,表示已經有裝置占用總線。

2. SEL (Select,選擇)信号

    該信号是“或态”信号,由發起方用以選擇目标方,或者由目标方用以重新選擇發起方。

3. C/D (Control/Data,控制/資料)信号

    該信号由目标方驅動,表示在資料總線上傳送的是資料信号還是控制信号。該信号處于真狀态時表示控制信号。

4. I/O(Input/Output,輸入輸出)信号

       該信号由目标方驅動,控制資料在資料總線上的移動方向。當 I/0 信号為“真”時表示是對發起方的輸入,資料由目标方向發起方傳送;若I/0信号為“僞”,則表示資料由發起方向目标方傳送。該信号也被用來區分選擇和重選階段。

5. MSG (Message,通信)信号

    該信号由目标方驅動,表示總線處于資訊傳送的通信階段。

6. REQ (Request,請求)信号

    該信号由目标方驅動,表示有資訊傳輸請求,請求一個 REQ/ACK 資料傳送握手過程。

7. ACK (Acknowledge,應答)信号

       該信号由發起方驅動,表示對REQ信号的應答。

8. ATN (Attention,提醒)信号

    該信号由發起方驅動,訓示一個提醒資訊,表明發起方有一個消息要給目标方發送。

9. RST (Reset,重置)信号

    該信号是“或态”信号,表示一個硬體重置狀态,訓示總線進入重新設定階段,清除所有使用總線的 SCSI裝置。

10. DB (DataBus,資料總線)信号

    DB 信号有兩種,分别是用于 8 位資料總線的 DB (7-0,P)和用于 16 位資料總線的DB (l5~O,P)。這些信号都用于傳送資訊的值,它們包括資料比特信号,加上奇偶檢驗比特信号。

       由于在SCSI總線上挂有多個裝置,一些控制信号可能同時被多個SCSI裝置驅動。這些信号被稱作“或态”信号。對于“或态”信号,SCSI裝置不會主動将其驅動成“僞”,而是依賴總線終接器,在總線上的所有裝置都沒有驅動該信号時将其設定成“僞。”隻要有 1個或多個裝置驅動該信号,該信号就是“真”。與“或态”信号相對照的是“非或态”信号。對于“非或态”信号,SCSI裝置可以将其驅動成“僞”。

3.6 SCSI 總線的使用階段

       根據對總線不同的使用,可以把SCSI總線狀态劃分成8個不同的階段:空閑階段,仲裁階段,選擇階段,重選階段,指令階段,資料階段,狀态階段和通信階段。

       其中指令階段,資料階段,狀态階段和通信階段都設計資訊在總線的傳送,是以又稱為:資訊傳送階段。

       除了空閑階段外,其他階段的總線都被SCSI裝置占用。

3.6.1. 總線空閑階段

       總線空閑表明沒有一個裝置在使用 SCSI 總線,也表示在此狀态下,SCSI 裝置如果需要,可以使用總線。SCSI裝置需要在總線上的 SEL信号和 BSY信号都是“僞”之後,才可以檢測總線是否處于空閑狀态。

作為例子,SCSI總線可能在下列情況下進入空閑狀态:

    1.RST信号被設定;

    2.不成功的總線選擇或重選;

    3.目标裝置解除連接配接;

    4.目标裝置指令完成。

    一旦一個SCSI裝置确定總線處于空閑階段,它就可以申請總線仲裁,進而進入仲裁階段。

3.6.2. 總線仲裁階段

       在 SCSI總線上的裝置必須先獲得總線連接配接權,然後才可以進行其他的操作。在預設條件下,看似挂在總線上的裝置在邏輯上是與總線斷開的,沒有參與總線上的活動。SCSI裝置隻有在需要進行資料傳輸和裝置狀态報告時才會申請總線連接配接權。SCSI裝置一旦得到了總線連接配接權,就将在發起方和目标方之間形成一個實體連接配接的通道,然後就可以進行資料傳輸。

       一般情況下,總線的擷取與對目标方的選擇都由發起方完成。為了更加高效地使用總線,在某些情況下,例如在有較長時間的CPU處理等待或裝置存取等待時,需要釋放總線以供其他裝置使用。在等待的相關任務完成後,再重新進行總線仲裁和連接配接權擷取操作,以繼續進行暫停的工作。是以,有時目标方也可以執行總線操作和連接配接權擷取操作,準确地講,是再擷取操作。

       SCSI總線上的裝置的優先級是由它的位址即 SCSI ID 決定的。在窄 SCSI 中的 ID 範圍是 0-7,對應的優先級是從 1 到 8。在寬 SCSI 中的ID範圍是O~l5,其中對應 IDO~7的優先級是從9到 16遞增,而對應 ID8~l5 的優先級是從 1 到 8 遞增。在這裡,我們用較大的數值表示較高的優先級,是以,ID7具有最高優先級。在窄 SCSI 中,ID 0具有最低優先級;在寬SCSI中,ID8具有最低優先級。

       SCSI總線上的 ID數目是與 SCSI資料總線寬度一緻的,是以,窄 SCSI有8個ID,寬 SCSI有 16個ID。在窄  SCSI 中的 8根資料線的編号是從0到 7,在寬 SCSI 中的 16根資料線的編号是從 0到 15。有趣的是,具有某個編号的資料線上的信号,還被用來表示具有對應号碼ID 的 SCSI裝置是否在執行選擇或相關操作。例如當資料總線中的資料線DB (2)在某個特定的階段被驅動成真時,就可以表示其ID為 2 的裝置已經在總線上執行了選擇或相關操作。

       在SCSI域中,主機是儲存設備的主要使用者,且對存儲的響應要求較高, 是以通常主機的優先級最高,其配置設定的ID值也最大,在窄 SCSI 中是 ID 7,在寬 SCSI 中是IDl5。

       總線仲裁就是在可能同時有多個裝置請求的情況下,最終隻給予其中的一個 SCSI裝置總線控制權的過程。SCSI裝置在檢測到“總線空閑”并等待一個時延後即可以把總線置成BSY,并把與它的 SCSI ID對應的資料線信号置為“真”,開始總線仲裁申請。

       在等待 1 個時延後,該SCSI裝置需檢測在資料總線上是否有更高優先級的 SCSI ID也為“真”。如果總線上确有更高優先級的裝置在進行總線申請,則該 SCSI 裝置不再置BSY和對應的資料線為“真”。放棄總線仲裁申請,直到下一次“總線空閑”;否則,該裝置就獲得了總線控制權,并由該裝置把SEL信号置為“真”。同時,總線上的其他SCSI裝置則檢測到 SEL信号為“真”後,不再置BSY信号和對應的資料線為“真”,放棄總線仲裁申請。為了保證确實已經獲得了總線控制權,該裝置在置SEL信号為“真”後、傳送其他信号前,需要有一定的時延。

       在總線仲裁階段結束時,總線上有BSY、SEL和與獲得總線的 SCSI裝置的 ID,其對應的資料線的信号為“真”。

3.6.3. 選擇階段

       在選擇階段,得到總線使用權的SCSI裝置在總線上選擇目标裝置,以便随後可以向該目标設各發送諸如讀和寫這樣的指令。這個階段主要是完成對具有特定SCSI ID的裝置的選擇,其相關協定的定義主要是在SCSI體系結構的互連層。需要注意的是,邏輯單元号LUN的尋址是邏輯單元通過SCSI傳輸層協定完成的,不在互連層。與LUN編址相關的協定在傳輸協定層描述。

       赢得仲裁的SCSI裝置在把BSY和SEL信号置成“真”,經過一小段時延後,即可進入選擇階段。作為發起方,赢得仲裁的SCSI裝置不可以把1/0信号置成“真”。在此階段,發起方需要把與自己的SCSI ID對應的資料線的信号和對應所要選擇的目标裝置的SCSI ID的資料線的信号置成“真”,經過一小段時延,再把BSY信号置成“僞”,然後等待目标方的響應。

       例如,SCSI ID為6的主機把對應自己的ID的資料線DB(6)和對應目标裝置的ID(=6)的資料線DB(0)置成“真”後,資料總線上信号值的狀态将如下所示。

     DS ( 0) DS (1) DS (2) DS (3 ) DS (4) DS (5) DS (6) DS (7)

      1           0           0          0          0           0           1          0

       此時,隻有兩個資料線的信号值是“真”。如果有多于兩個的資料線為“真”,則目标方認為有誤。目标方在SEL和對應它的ID的資料線的信号為“真”并且BSY和I/0信号為“僞”的情況下,就可以确定它自己已經被選為目标裝置。此時,目标方裝置應該重新把BSY信号置成“真”。發起方在檢測到BSY為“真”的信号後,就把SEL信号置成“僞”。特别需要注意的是,在該階段結束時,BSY信号是由目标方置位的。

3.6.4. 重選階段

       在 SCSI 目标裝置忙于處理其内部事務 (通常是對于執行對存儲資料的讀或寫操作)期間,它可以在等待操作 (比如把存儲在裝置中的資料讀入緩沖區或把暫存在緩沖區的資料寫入緩沖區)完成時釋放總線供其他裝置使用,并在操作完成後重新申請對總線的使用權。是以,重選階段也發生在“總線仲裁階段”之後。但與選擇階段不同,重選階段由目标方啟動,重建立立由發送方啟動成功但被目标方挂斷的連接配接。

       在目标裝置釋放了總線之後,BSY和 SEL信号處于被置成“真”的狀态。此時日标裝置通過把I/0信号置成“真”使自己成為赢得對總線使用權的一方。在重選階段,目标方也需要把與自已的 SCSI ID 對應的資料線的信号和對應發送方裝置的 SCSI ID的資料線的信号置成“真”,經過一段短的時延,再把BSY信号置成“僞”,然後等待發起方的響應。

       發起方在SEL、I/0和對應它的 ID 的資料線的信号為“真”并且BSY為“僞”的情況下,就可以确定它自己已經被重選。被重選的發起方可以通過檢視資料總線來驗證重疊的目标方的 SCSI ID。然後,發起方設各重新把BSY信号置成“真”。目标方在檢測到BSY為“真”的信号後,它也執行把BSY驅動成“真”的操作,并把 SEL信号置成“僞”。

       被重選的發起方在檢測到 SEL信号為“僞”後,它就把BSY置成“僞”,而目标裝置則繼續把 BSY 設定成“真”,直到它放棄對總線的使用權為止。這樣,在該階段結束時,信号的狀态與選擇階段一樣,也是由目标方設定的BSY信号。

3.6.5. 信号傳送階段

       指令階段、資料階段、狀态階段和通信階段被組合在一起作為資訊傳送階段,因為它們都被用來通過資料總線傳送資料或控制資訊。SCSI 使用 C/D、I/0 和 MSG信号區分不同的資訊傳送階段以及對應的資訊傳輸方向。目标方驅動這3個信号,控制從一個階段到另一個階段的轉變。發起方可以通過把ATN信号置成“真”請求一個“通信出”階段,而目标方可以通過釋放MSG、C/D、I/0 和 BSY信号引入總線空閑階段。資訊傳送階段使用一個或多個REQ/ACK握手過程控制資訊傳送。每個REQ/ACK握手過程允許傳送 1個或多個位元組的資訊。因為資訊傳送階段一定是在選擇階段或重選階段之後,是以不改變BSY和 SEL信号。事實上,在該階段,BSY持續為“真”,SEL信号持續為“僞”。

       表2-2 示出了 MSG、C/D和I/0信号值與階段名及資訊傳輸方向之間的關系。其中的“出”和“入”是相對子發送方裝置而言的,且資料傳輸方向由I/0信号确定。

表 2-2  MSG、C/D和 1/0信号值與階段名及資訊傳輸方向之間的關系

  MSG   CID   1/0  階段  具體階段  傳輸方向
  1  * (未用)
 * (末用)
 通信  通信出  從發送方到目标方
 通信入  從目标方到發送方
 資料  資料出
 資料入
 指令
 狀态

注釋:0=僞,1=真,*=保留未來定義

       指令階段允許目标方請求發起方傳送指令資訊。在指令階段的 REQ/ACK 握手過程中,目标方把C/D信号置成“真”,把I/0信号和MSG信号置成“僞”。

       資料階段包括“資料入”階段和“資料出”階段。

(1)“資料入”階段允許目标方請求把資料從目标方傳送給發起方。在“資料入”階段的 REQ/ACK 握手過程中,目标方把I/0信号置成“真”,把C/D信号和MSG信号置成“僞”。

(2)“資料出”階段允許目标方請求把資料從發起方傳送到目标方。在“資料出”階段的 REQ/ACK 握手過程中,目标方把C/D信号、I/0信号和 MSG信号都置成“真”。

       狀态階段允許目标方請求把狀态資訊從目标方傳送給發起方。在狀态階段的REQ/ACK握手過程中,目标方把C/D信号和I/0信号置成“真”,把MSG信号置成“僞”。

       通信階段可以是“通信入”階段或“通信出”階段。無論是在“通信入”階段,還是在“通信出”階段,都可以傳送多條消息。傳送的第一個位元組可以是單位元組消息,也可以是多位元組消息的首位元組。在 1 個通信階段可以傳送多個多位元組消息。

       “通信入”階段允許目标方請求把消息從目标方發送給發起方。在“通信入”階段的 REQ/ACK握手過程中,目标方把C/D信号、I/0信号和 MSG信号都置成“真”。

    “通信出”階段允許目标方請求把消息從發起方傳送到目标方。目标方在響應發起方建立的提醒條件時調用“通信出”階段。在“通信出”階段的 REQ/ACK 握手過程中,目标方把C/D信号和 MSG信号置成“真”,把I/0信号置成“僞”。

3.7  異步傳輸和同步傳輸

       與傳統網絡的資料包傳送方式不同,SCSI 基于REQ/ACK 信号控制資料傳輸的過程。 根據REQ和ACK信号控制與資料總線置位時間的差别,資訊傳輸又可分為異步傳輸和同步傳輸兩個列别。 而且,無論傳輸的方向如何,資訊的傳輸都是由REQ信号開始,并且REQ信号都是由目标方控制和發送的。

1. 異步資訊傳輸

       異步傳輸方式可用于資料階段的資料傳輸,也可用于指令、狀态和通信階段的資訊傳輸。首先,資訊傳輸的方向是由 I/O信号決定的。如果 I/O信号為“真”,那麼資訊是由目标方向發起方傳輸。在此情況下,為了傳送資訊,目标方先把資料線 DB(7/15-0,P)信号置成對應想要傳送的二進制數位序列的值,然後把REQ信号置成“真”。 發起方在檢測到REQ為“真”時,讀取資料總線的值,然後把ACK信号置成“真”。當目标方檢測到ACK為“真”時,它就可以改變或取消放置在資料總線上的值,并把REQ置成“僞”。發起方在檢測到REQ置成“僞”時把ACK也置成“僞”。當目标方檢測到ACK為“僞”時,總線上就完成了一次資料傳輸,并可進行下一次資料傳輸。

       在異步傳輸方式中,每個REQ/ACK握手過程傳送 1個(對于窄 SCSI)或 2 個位元組(對于寬 SCSI)的資訊。特别需要注意的是,在此方式中,目标方在置 REQ 信号後,必須持續地把資料線 DB (7/l5~O,P)置成對應所要傳送的二進制數位序列的值,直到它檢測到ACK為真為止。

       如果I/O信号為“僞”,那麼資訊是由發起方向目标方傳輸。在此情況下,目标方通過把REQ置成“真”來請求資訊。發起方驅動 DB (7/l5~O,P)到它需要發送的二進制數位序列的值,然後把 ACK置成“真”。此後,繼續把 DB (7/l5~O,P)信号置成這個二進制數位序列的值,直到 REQ 變成“僞”為止。目标方則是在檢測到 ACK變成“真”時,讀 DB (7/l5~O,P)的值,然後把 REQ 置成“僞”。發起方在檢測到REQ變成“僞”時,它可以改變或取消放置在資料總線上的值,并把ACK置成“僞”。

       此後,目标方可以通過把REQ置成“真”,繼續請求資訊。

2. 同步資料傳輸

       同步資料傳輸隻在資料階段使用,并且是在目标方和發起方之間建立同步資料傳輸協定之後使用。

       與異步傳輸中的規則相同,當 I/0 信号為“真”時,資料是由目标方向發起方傳輸。目标方先把資料放置到資料總線上,即置 DB (7/l5~O,P)對應的線路,然後把REQ置成“真”。在同步資料傳輸中,目标方在把REQ置成“真”後,需要把放置在DB (7/l5~O,P)上的二進制數位序列的值保持一個指定長度的時間,但不必維持到對ACK信号變“真”的接收。這是與異步傳輸不同的一個地方。在指定長度的時間期滿後,目标方就可以把 REQ 置成“僞”,并且可以改變或取消放置在資料總線上的值,然後準備發送下一個資料。發起方在檢測到REQ變“真”之後一個指定長度的時間内讀DB (7/l5~O,P)上的值,然後把ACK置成“真”作為對目标方的響應。

       與異步傳輸一樣,在同步資料傳輸中,發起方也在接收到一個REQ并讀取了資料總線上的值之後就發送一個ACK信号。但與異步傳輸不同的是,目标方在接收到對一個資料的ACK之前可以發送多個REQ信号。SCSI為同步資料傳輸的REQ/ACK握手過程定義了一個稱作REQ/ACK飽和值的參數,它表示在接收到ACK信号前可以發送的最大REQ信号數。如果發送的REQ數日多于接收到的ACK數目,并達到了定義的REQ/ACK飽和值,那麼目标方暫停發送REQ信号和資料,直到接收到下一個ACK為止。這在原理上與傳統網絡中的流控制類似。    

       當 I/O信号為“僞”時,資料是由發起方向目标方傳輸。發起方每次接收到一個REQ信号就發送一次資料。目标方先把REQ置成“真”。發起方檢測到REQ變“真”後把要發送的資料放置到資料總線上,即置DB (7/l5~O,P)對應的線路,然後把ACK置成“真”。接着發送方需要在一個指定長度的時間内保持在總線上放置的資料不變, 并繼續把ACK置成“真”。在指定的時間期滿後,發起方可以把ACK置成“僞”,并且可以改變或取消放置在資料總線上的值。目标方在檢測到ACK信号變“真”後,在指定的ACK保持為“真”的時間内讀取資料總線上的資料,并把REQ置成“僞”。

       此後,目标方可以通過把REQ再置成“真”繼續請求資訊。

3.8  SCSI 指令描述塊

       在互連層完成 SCSI裝置對總線的連接配接,以及發送方和目标方的選擇的基礎上,傳輸層協定執行實際的資料傳輸。傳輸層提供了兩類服務,一是指令的執行和确認;二是資料的傳送。指令的執行是在總線進入指令階段後,發起方通過指令描述塊(command description block,CDB)向目标方發送具體的指令。指令的确認是在總線進入通信 (Message)階段後,發起方接收由目标方發送的指令執行确認資訊。資料的傳送則是在資料階段 (資料出或資料入)進行的。傳輸協定的運作過程包括發送指令、傳輸資料和對指令執行的确認。SCSI基礎指令規範   SPC (SCSI Primary Commands,SCSI基礎指令)定義了 CDB 的标準。

       除了基本指令外,SPC還定義了所有類型的 SCSI 目标方設各都可以使用的管理參數,如診斷參數和日志參數等。

       發起方對儲存設備的實際操作是通過向目标方發送一個指令描述塊來完成的。在一些情況下,在一個指令描述塊之後可能還有一些參數要傳給目标方,按照具體的協定,這些更多的參數是在指令描述塊後的“資料出”階段發送的。指令描述塊有定長和不定長兩種格式,而定長格式的指令描述塊又有 6、10、12或 16位元組不同的長度規定。

指令描述塊由編号從0~5 的 6個位元組組成。下面介紹其中各個段的内容。

1. 操作碼

       操作碼是所有指令描述塊都有的,它總是被放在指令描述塊的開頭一個位元組。正如其名字所言,操作碼定義CDB 的具體操作。8 比特在理論上共有256個可能的操作碼。實際上其中有一些是保留碼,日前尚未定義。操作碼的 8 個二進制位又分為兩部分:5-7位是組代碼,訓示該指令具體屬于哪個指令組,它決定 CDB 的長度,如“000”為組“0”,表示6個位元組的CDB指令組,0-4位則是具體的指令代碼。

2. 混雜CDB資訊

       該參數表示與具體的CDB相關的資訊,其中一個例子是表示邏輯裝置号,尋址在SCSI 目标裝置中的一個邏輯單元。對應一個SCSI ID 的裝置可以有多個邏輯單元,是以邏輯單元擴充了 SCSI總線可通路的裝置數目,使得目标方設各上可以有多個可被通路的裝置而隻占用一個有效的 SCSI ID。對一個邏輯單元的實際通路是通過該邏輯單元的一個特定的編号,即邏輯單元号實作的。

3. 邏輯塊位址

       該位址是邏輯單元 (比如磁盤)中的起始操作塊的位置。在 6 位元組的CDB 中,有21 位的邏輯塊位址。SCSI把邏輯單元、卷或分區抽象成塊的數組,每一塊都有一個邏輯位址,編号從 0 開始。對 SCSI 儲存設備的每一次讀/寫操作都是針對一組連續的邏輯塊進行的,因而需要指出起始塊的邏輯位址。

4. 傳送長度

       該長度表示指令所請求的傳送量,通常是塊數。在有些類别的 CDB 中也可能是位元組數。0表示不需要傳送資料。

5. 參數表長度

       有些指令還需要更多的參數,這些參數由客戶提供,定義在“資料出”緩沖區中。參數表長度就表示需要傳送到儲存設備的這類參數的長度,0表示不需要傳遞參數。

6. 配置設定長度

       配置設定長度表示應用客戶為“資料入”緩沖區配置設定的最大長度,根據具體的CDB類别,可能是位元組數,也可能是塊數。應用客戶通常使用該“資料入”緩沖區接收特殊資訊,如日志資料、診斷資料等。如果傳送的資訊量超過了配置設定長度表示的最大值,則相關裝置不應再傳,并使用狀态階段傳回特定的狀态資訊。

7. 控制碼

       它是所有 CDB 格式的最後一個位元組。在其中有一些特殊的域,如已經定義的一個NACA位。在一些情況下,一個指令的執行會以“檢查條件 (Check Condition)”狀态中止,它表明在指令執行過程中出現了錯誤或異常。  有些指令執行的錯誤或異常不會影響其他指令的執行,也不需要作善後的恢複處理,而另一些指令執行的錯誤或異常則可能導緻指令組中的其他指令被異常中止,需要專門的指令對其做善後處理,并要求存儲設各在完成善後處理工作之前不再處理該使用者的其他指令。為了區分這兩種不同的情況,也為了讓應用客戶能夠事先聲明哪些指令執行的錯誤或異常需要善後處理,SCSI允許應用客戶在CDB 的控制碼中設定NACA位,請求儲存設備在指令執行以“檢查條件”狀态中止時建立“自動跟随”條件 (Condition),進而允許應用客戶在随後的善後處理指令中把新 (New)任務的屬性設定成自動跟随 (Auto ContingentAllegiance,ACA)。

3.9  SCSI 的讀操作和寫操作過程

1. SCSI的讀操作過程

       如果計算機要從儲存設備上讀取檔案或資料,那麼無論資料的大小如何,都至少要經曆一個SCSI的讀操作過程。當然,作業系統需首先将使用者的讀取操作通過 SCSI I/0的應用程式程式設計接口 (Application Programming Interface,API)轉化為 SCSI的讀操作,并在操作完成後通過相應的API傳回響應的值。

在SCSI域内,這個操作在傳輸層被簡單地描述成 5個主要過程:

    (1)發起方通過CDB發送SCSI的讀指令。

    (2)目标方接收到該指令,通過裝置管理器在指定的邏輯單元中執行該指令請求的操作。

    (3)目标方以位元組為機關向發起方傳送資料。

    (4)在資料傳輸完畢後,目标方向發起方發送指令完成的報告。

    (5)發起方接收到指令完成的響應。

       當然,這些過程是建立在 SCSI 互連層的基礎上的。在第一個過程之前,SCSI 總線由空閑階段進入總線仲裁和選擇階段,完成發起方對總線使用權的獲得以及對目标方的選擇和尋址。

       在第一個過程中,目标方發送REQ信号,請求資訊傳輸,控制總線進入資訊傳送的指令階段。目标方通過發送方傳送的 CDB擷取“讀”指令。在其後的第 2 個和第 3個過程中,目标方從它控制的外圍裝置中讀取資料并發送到發起方。如目标方準備資料需要較長的時間,則可能有多個總線釋放、進入空閑和重選階段的輪回。目标方在每次完成資料傳送後,都控制總線進入狀态階段并傳回一個狀态資訊。為進一步表示讀指令的全部完成,在第四個過程中,總線進入資訊傳送的通信階段,目标方發送“指令完成”資訊,并可釋放 SCSI 總線的 BSY信号。在第五個過程中,發起方接收到日标方指令完成的響應,總線可恢複到空閑階段。

2. SCSI的寫操作過程

       SCSI的寫操作過程與讀操作過程類似,但資料傳送的方向不同,它把資料從發送方向目标方傳送。在發送方系統中有對檔案做寫操作的使用者請求時,它先通過檔案系統查找該檔案在儲存設備 (如磁盤)上的邏輯塊位址  (Logical BlockAddress,LBA),接着檔案系統把該LBA連同其他一些參數,如資料的指針、資料的長度以及邏輯單元号等傳遞給SCSI 的 API,并訓示一 個寫操作。例如寫 6000位元組到 LUNO 的邏輯塊位址OOOl234AB。SCSI的API則具體發送一個寫指令給LUNO,并将資料以儲存設備認可的方式分批或一次性地傳遞到 LUNO,直到資料全部傳輸完畢。之後,SCSI 的 API傳回,并訓示任務完成。然後,檔案系統通知應用程式任務完成。至此,一個檔案的寫操作完成。

當然,在資料寫操作中,仍然需要具體運作SCSI的各個階段,并需要發送SCSI信号以及SCSI指令,如寫指令等。這些方面都與上面描述的讀操作類似,此處不再贅述。

       從上面的介紹可以看出,一個簡單的資料讀或寫操作會涉及一系列的過程。實際上,在這些過程中,除了有應用程式 (如字處理軟體、資料庫等)為使用者提供的直接操作界面和作業系統給應用程式提供的通用的系統功能外,還有檔案系統、SCSIAPI、SCSI裝置指令、SCSI驅動程式、總線和儲存設備等多種軟硬體的參與。

繼續閱讀