一個scsi host adapter可能擁有多個channel,每個channel擁有一條scsi總線。傳統scsi總線是並行共享總線,現有的SATA、SAS等P2P 接口在邏輯上可以理解成總線的一種特例,所以scsi middle level驅動程序是通用的。由於一個scsi host可能存在多個channel,因此依次掃描每個channel。按照spec,傳統scsi bus上最多可以連接16個scsi target,因此,scsi掃描程序會依次探測target。一個scsi target可以存在多種功能,每種功能稱之為LUN,對於單功能設備(例如磁盤),其LUN通常為0。
Scsi host的掃描過程可以簡單采用如下偽碼進行描述:
For (channel = 0; channel < max_channel; channel++) {
/* 對一個適配器的每個通道中的設備進行識別 */
…
For (id=0; id<max_id; id++) {
/* 對一個通道中的每個ID對應設備進行識別 */
...
For (lun=1; lun<max_dev_lun; lun++) {
/* 對一個ID對應設備的每個LUN進行識別 */
...
}
}
}
通過上述掃描過程可以知道,在系統中可以采用如下方法對一個scsi device進行描述:host_id : channel_id : target_id : lun_id
其中,host_id是系統動態分配的,這與PCI總線的掃描順序相關,對於固定硬件的系統host_id掃描得到的結果不會改變,但是,如果動態添加一個scsi host(PCI device),系統的host_id可能會發生變化,這一點需要注意。