现在的位置: 首页 > 综合 > 正文

磁盘驱动的简单分析

2011年07月24日 ⁄ 综合 ⁄ 共 1574字 ⁄ 字号 评论关闭

在atapi.sys的DriverEntry里会调用ScsiPortInitialize。 PCI中有8个条PCI bus。在ScsiPortInitialize中对每条PCI Bus调用一次AtapiFindCompatiblePciController或AtapiFindIsaBusController,用来寻找ATAPI的Controller。如果发现HBA,则调用ScsiPortCreatePortDevice函数创建scsi对象。

系统会分别调用两次AtapiFindCompatiblePciController
分别找到Prime和Second Channel,分别对应着中断14和15,然后分别调用AtapiFindDevices,会分别找到每个Channel的IDE设备。

 

其中AtapiFindCompatiblePciController会调用ScsiPortGetBusData去枚举每一个pci的function。如果发现BaseClass==1且SubClass==1,即被认定为IDE Controller.

image

(摘在pci2_2.pdf中的Figure D-1: Programming Interface Byte Layout for IDE Controller Class Code)

 

如果AtapiFindCompatiblePciController找到IDE设备后,就调用ScsiPortCreatePortDevice,为其创建一个scsi设备。

因为ATAPI设备室支持scsi command的,所以通过向这个scsi设备发送scsi command可以传送到ATAPI设备,然后被解释执行。

ScsiPortCreatePortDevice会用IoCreateDevice创建一个对象,然后用IoConnectInterrupt为将Prime或者Secondary Channel的的中断与这个设备对象连接,并设置好中断回调函数ScsiPortIsr。

ScsiPortIsr会调用DPC例程,然后在DPC例程中会申请SRB块,并将请求传送进SCSI设备对象。

在disk.sys中的DriverEntry会调用ScsiClassInitialize,它会枚举所创建的scsi设备对象。
ScsiClassInitialize会调用DiskClassFindDevices,
而DiskClassFindDevices还会调用ScsiClassGetCapabilities、ScsiClassGetInquiryData、ScsiClassFindUnclaimedDevices

然后对所有Unclaimed的设备进行DiskClassCreateDeviceObject

 

在DiskClassCreateDeviceObject中,首先创建这个硬盘对象的一个根目录,即\Device\Harddisk0。
然后紧接着调用ScsiClassClaimDevice
然后用ScsiClassCreateDeviceObject创建分区0,即\Device\Harddisk0\Partition0
然后调用ScsiClassReadDriveCapacity询问分区0设备
然后调用IoReadPartitionTable,读取分区表信息,他是调用xHalIoReadPartitionTable来实现的

DiskClassCreateDeviceObject通过读取\Device\Harddisk0\Partition0读取MBR信息,分析出一共有多少个分区。
然后依次对每个分区创建一个设备对象,例如\Device\Harddisk0\Partition1

vfatfs.sys的DriverEntry会调用IoRegisterFileSystem函数。

抱歉!评论已关闭.