歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux-2.6平台下的SCSI子系統

Linux-2.6平台下的SCSI子系統

日期:2017/2/28 14:54:00   编辑:Linux教程

Linux SCSI子系統是一種分層的架構,如圖所示:

共分為三層。

Lower level層:代表適用於SCSI的物理接口的實際驅動器。底層驅動的主要作用是發現連接到主機適配器後面的SCSI設備,在內存中為它們建立好數據結構,並提供消息傳遞接口,將SCSI命令的接收與發送解釋為主機適配器的操作。

Upper level層:

SCSI 子系統的較高層代表的是內核(設備級)最高級別的接口。它由一組驅動器組成,比如塊設備(SCSI 磁盤和 SCSI CD-ROM)和字符設備(SCSI 磁帶和 SCSI generic)。較高層接受來自上層(比如 VFS)的請求並將其轉換成 SCSI 請求。較高層負責完成 SCSI 命令並將狀態信息通知上層。

SCSI 磁盤驅動器在 ./linux/drivers/scsi/sd.c 內實現。SCSI 磁盤驅動器通過調用register_blkdev(作為塊驅動器)進行自初始化並通過 scsi_register_driver 提供一組函數以表示所有 SCSI 設備。其中sd_probe 和 sd_init_command 這兩個函數很重要。只要有新的 SCSI 設備附加到系統, SCSI 中間層就會調用sd_probe 函數。sd_probe 函數可決定此設備是否由 SCSI 磁盤驅動器管理,如果是,就創建新的scsi_disk 結構來表示它。sd_init_command 函數將來自文件系統層的請求轉變成 SCSI 讀或寫命令(為完成這個 I/O 請求,sd_rw_intr 會被調用)。

中間層:SCSI 中間層是 SCSI 較高層和較低層的公共服務層(可以在 ./linux/drivers/scsi/scsi.c 內部分地實現)。它提供了很多可供較高層和較低層驅動器使用的函數,因而可以充當這兩層間的連接層。中間層很重要,原因是它抽象化了較低層驅動器(LLD)的實現,可以在 ./linux/drivers/scsi/hosts.c 中部分地實現。這意味著可以以同樣的方式使用帶不同接口的 Fibre Channel 主機總線適配器(HBA)。

SCSI子系統的源代碼位於目錄drivers/scsi/下,頭文件在include/scsi/目錄下。SCSI子系統的主要功能是:

. 探測SCSI設備,在內存系統中構造SCSI子系統的目錄樹;

. 在sysfs文件系統中構造SCSI子系統的目錄

. SCSI高層驅動綁定SCSI設備,在內存中構建對應的核心結構;

. 提供錯誤恢復API,在SCSI命令錯誤和超時後被調用。

Copyright © Linux教程網 All Rights Reserved