當我們講到scsi命令這個概念時,需要根據上下文去理解。可能指代兩個概念:
- 一種含義指scsi協議規劃中定義的scsi 命令描述塊(command descriptor block (cdb))。此描述塊定義了需要target處理的具體的操作。遵循特定的資料格式,其格式根據操作的不同而不同。scsi規範中針對每個命令的cdb都有詳細的說明。描述塊會經過傳輸層完整的傳送到scsi target用於解析並執行。
- 另外一種含義指核心中定義的scsi_cmnd結構。該結構定義於linux/include/scsi/scsi_cmnd.h
中,描述了請求在scsi子系統執行所需要的資料結構。每個請求都會建立乙個scsi_cmnd資料結構。它建立於請求的初始化,結束於命令被正確的執行或者在操作中出現錯誤。其儲存的資訊不僅僅包括了最終傳送給scsi target的資料,也包括了在scsi子系統和scsi底層驅動執行中需要的執行時資訊。
隨著技術的發展 ,儲存裝置的容量持續增長。原有的scsi指令的定址空間不能滿足新的要求,於是就定了新的可支援更大空間的cbd格式。考慮到向前相容,scsi協議沒有取消原有的指令,而是重新定義操作碼。於是,針對一種服務(如讀、寫)定義了多種指令格式。
cbd格式分為定長格式和變長格式。
定長格式的cbd包括6、10、12、16四種格式,數字表示cbd的長度(單位:位元組)。所有定長指令的第乙個位元組均為操作碼,最後乙個位元組為控制塊。其它域取決於指令。
變長格式,其長度取決於具體的指令。如read(32)、write(32)分別為32位元組。變長格式第乙個位元組為操作碼,固定為操作碼(7fh),其具體服務(如讀、寫)放在service action
域,即cbd的第8、第9位元組。變長格式的前10個位元組是固定的。
無論是定長格式還是變長格式,都包括固定部分,即所有的指令都有的。這樣有利於程式設計。系統可以將cbd前幾個位元組進行統一的解析,再進一步的根據操作碼判斷後面是否有資料段需要進一步解析。
cdb在核心中表現為乙個連續的記憶體空間。通常它的儲存空間在請求初始化時被建立,隨著請求完成被釋放。請求初始化過程中給cmnd分配了16個位元組。
當cdb長度大於32時,驅動程式它初始化時建立的專用快取池sd_cdb_pool
上申請。
read讀命令可以分成兩種格式。read(10)、read(12)、read(16)格式一致,歸為第一類。read32歸為第二類。
read(10)、read(12)、read(16)所包括的屬性一致。兩者別在於lba與資料傳輸位元組數兩個欄位的長度,這兩個字段長度決定了scsi指令所能支援的最大容量和一次io最大的資料長度。自scsi-3始,規範建議實現方將read(10-12)遷移到read16上。
read(16) cbd格式如下圖:
各個字段含義:
字段含義
實現operation code
指令操作碼|呼叫sd_setup_read_write_cmnd
設定
rdprotect
dif支援相關屬性
呼叫sd_setup_read_write_cmnd
設定;設定值取決於磁碟dif保護方式
dpo禁用頁面快取(disable page out)。
設定1意為執行此操作時,不進行快取替換
設定為0意為讀取時同時在裝置快取中保留此資料
linux永遠設為0
fua強制訪問介質。
如果設定為1,意味著target強制從介質中讀取資料,而非從快取中
在構造io請求(struct request
)時根據應用要求設定;
rarc
重構輔助模式。
scsi層未處理
logical block address
讀命令的起始位址
與請求的起始位址一致。以扇區(512位元組)為單位
transfer length
讀寫資料長度
與請求的讀寫長度一致
control
命令控制塊
scsi子系統未設定
變長由自第12位元組始的8位元組表示lba,由第28位元組始的4個位元組表示資料長度。其支援的最大容量與最大扇區數與read16相同。其它變數的含義與read(16),不詳細解釋。
比定長cbd多出來的位元組主要是用於資料校驗。t10是用於解決靜默錯誤的一種機制。
資料在讀寫環境中要經過多個部件、多個傳輸渠道和多層次的軟體系統,考慮到效能,系統設計過程中並非每層次都對資料進行檢測。如此,最終固化的到磁碟上的資料可能是不正確的。為避免此類錯誤存在,ansi t10 定義了一種通過對每個資料塊加入保護資訊(pi:protection information)也曾被稱作資料完整性域(dif:data integrity field)的方法來保護資料完整性。只有開啟t10資訊檢驗且採用type2 保護資訊時,才使用read(10)命令格式。
p10在企業oracle資料庫應用比較廣泛,且是儲存一大亮點,所以主流的儲存廠商都支援該特性,如emc vnx系列支援自定義pi、vmax支援標準的t10 pi,且支援dix;hds hus系列支援自定義pi、hds vsp支援pi;ibm ds8000支援標準的t10 pi,ds5000某些特定型號支援pi;hp p10000支援標準的t10 pi,華為 oceanstor 18000和v3全系列。 1
寫命令與讀命令在格式上非常相似,也分為多種格式。
不同的寫操作對應的服務是一致的。在target端可對應於相同的實現。以write(10)為例。其操作碼為24a。同時,也包括了用於dif處理的wrprotect域,用於快取控制的dpo、fua域。
↩
GitHub操作流程
github操作流程 第一次提交 方案一 本地建立專案根目錄,然後與遠端github關聯,之後的操作一樣 初始化git倉庫 git init 提交改變到快取 git commit m description 本地git倉庫關聯github倉庫 git remote add origin git gi...
GIT操作流程
1 git clone 倉庫位址 2 開啟專案資料夾,會發現剛才在github裡面新建的檔案都存在本地了 3 將要上傳的檔案拷貝到這個目錄下,拷貝完成後,再執行下命令git status,看git是否獲取到檔案的更改 4 再執行命令git add all,將所有檔案都新增到倉庫中,如果想新增某乙個檔...
git操作流程
新增到自己的分支 建立分支並切換 xl git checkout b xl 自己的分枝 xl 1.切換到自己分支 git checkout xl 2.檢視狀態 git status 3.上傳檔案 git add 4.新增描述 git commit m update 5.新增到對應分支 git pus...