https://blog.csdn.net/keepingstudying/article/details/51740632
http://ilinuxkernel.com/?p=794
Small Computer Systems Interface (SCSI) 是一組標准集,它定義了與大量設備(主要是與存儲相關的設備)通信所需的接口和協議。 Linux® 提供了一種 SCSI 子系統,用於與這些設備通信。Linux 是分層架構的一個很好的例子,它將高層的驅動器(比如磁盤驅動器或光驅)連接到物理接口,比如 Fibre Channel 或 Serial Attached SCSI(SAS).
scsi設備:機器外設總線是計算機內部與外設進行通訊的總線,分為IDE總線,SCSI總線和USB總線.IDE總線是PC機上用得最多的總線,其造價比較便 宜.SCSI總線的速度比IDE總線要快得多,不過造價比較高.IDE總線和SCSI總線一般只於硬盤,光驅和掃描儀等,而USB總線則可以用於更多的外 設,且速度更快.一般來說,這三種外設總線是不可以混合使用的,但如果有總線轉換器則可以在一定程度上混合使用,如SCSI總線就可以有向IDE總線進行 轉換的轉換器.
SCSI-3 的開發開始於 1993 年,現已成為了一組標准集,可以定義協議、命令集和信令方法。在 SCSI-3 中,包含一組命名為 Ultra 的並行 SCSI 標准和基於串行 SCSI 的協議,比如 IEEE 1394 (FireWire)、Fibre Channel, 、Internet SCSI (iSCSI) 和新興的 SAS。這些標准通過引入存儲網絡技術(比如 FC-AL 或 iSCSI)改變了傳統的存儲理念,將數據速率擴展到了 1 Gbit/s,將最大的可尋址設備數增加到了 100 以上,並將最大的電纜長度擴展到了 25 米。圖 1 展示了從 1986 至 2007 年 SCSI 的數據速率的變化 .
SCSI 傳輸所采用的協議已經時過境遷,SCSI 命令卻保持了最初的元素。SCSI 命令是在 Command Descriptor Block (CDB) 中定義的。CDB 包含了用來定義要執行的特定操作的操作代碼,以及大量特定於操作的參數。
SCSI 命令支持讀寫數據(各有四個變量)以及很多非數據命令,比如 test-unit-ready(設備是否已就緒)、inquiry(檢索有關目標設備的基本信息)、read-capacity(檢索目標設備的存儲容 量)等等。目標設備支持何種命令取決於設備的類型。發起借助大約 60 種可用命令,SCSI 可適用於許多設備(包括隨機存取設備,比如磁盤和像磁帶這樣的順序存儲設備)。SCSI 也提供了專門的命令以訪問箱體服務(比如存儲箱體內部當前的傳感和溫度)。
圖 2 顯示了 SCSI 子系統在 Linux 內核中的位置。內核的頂部是系統調用接口,處理用戶空間調用到內核中合適的目的地的路由(例如 open、read 或 write)。而虛擬文件系統(VFS) 是內核中支持的大多數文件系統的抽象層。它負責將請求路由到合適的文件系統。大多數文件系統都通過緩沖區緩存來相互通信,這種緩存通過緩存最近使用的數據 來優化對物理設備的訪問。接下來是塊設備驅動器層,它包括針對底層設備的各種塊驅動器。SCSI 子系統是這種塊設備驅動器之一。
者通過 inquiry 命令識別設備類型。表 1 列出了最常用的 SCSI 命令。
我們以Redhat Enterprise Linux 6內核源碼2.6.32-71.e16版本為例,分析Linux內核SCSI層是如何給硬盤分配盤符的,即/dev/sda、/dev/sdb … /dev/sdm等盤符的由來。
sd_probe()函數
系統中有新的SCSI磁盤(包括USB硬盤)插入,就會調用sd_probe()函數。
哪里決定盤符?
index的值決定了盤符(sd_probe()函數中第2277行)。
若index=0,則分配給此塊SCSI硬盤的盤符為sda;
若index=1,則分配給此塊SCSI硬盤的盤符為sdb;
… …
若index=25,則分配給此塊SCSI硬盤的盤符為sdz;
函數在文件drivers/scsi/sd.c中。