歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux中磁盤掃描流程的描述

Linux中磁盤掃描流程的描述

日期:2017/2/25 10:38:29   编辑:Linux教程
 通常SCSI總線適配器作為PCI設備的形式存在,在系統初始化時會掃描系統PCI總線,由於scsi host adapter掛接在pci總線上,因此會被pci掃描軟件掃描得到,並且生成一個pci device(PDO)。然後掃描軟件需要為該pci device加載相應的驅動程序。在linux系統中,遍歷pci bus上存在的所有驅動程序,檢查是否有符合要求的驅動程序存在,這裡假設scsi host是marwell的設備,那麼,如果存在marwell提供的scsi host driver,就會被成功調用。加載scsi host驅動時,pci掃描程序會調用scsi host driver提供的probe函數,該probe函數是scsi host driver在初始化驅動時注冊到pci-driver上的(Linux的總線驅動都是采用的這種思路)。在scsi host具體的probe函數中會初始化scsi host,注冊中斷處理函數,並且調用scsi_host_alloc函數生成一個scsi host,然後添加到scsi middle level,最後調用scsi_scan_host函數掃描scsi host adapter所管理的所有scsi總線。

  一個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可能會發生變化,這一點需要注意。

Copyright © Linux教程網 All Rights Reserved