探测硬盘是否存在
- 1. 为什么要探测硬盘存在
- 2. 探测硬盘存在的方法
- 先用ATA设备的IDENTIFY命令获得硬盘参数
- 读硬盘的最后一个扇区进行检验
1. 为什么要探测硬盘存在
一般认为这是BIOS干的事情,不用自己取处理。好吧,我没办法在32位保护模式下使用BIOS的int 13h,所以我只能写自己的硬盘驱动。
另一个问题是,BIOS并不提供具体的硬盘端口信息,也不提供硬盘具体连接在那个端口上,如果要写驱动程序,又必须获得这些参数。
2. 探测硬盘存在的方法
在ATA标准中好像没有,其实是因为文档太长,而且是英文的,所以没有找得很仔细,也许在里面有提到。
然后就是一大堆在windows或者linux下用API来获得硬盘信息的资料。
而我的需求是:在裸机的状态下,相当于没有操作系统、没有BIOS的情况下来探测硬盘
折腾了一轮下来,发现没什么标准方法,只好用最笨的方法了,遍历所有标准端口,然后非标准端口呢?扩展端口呢?好吧,只能留到以后在处理了。所以,我的系统目前只能从标准的ATA硬盘端口启动了,至于为什么不探测SATA或者其他的,主要是因为Hyper-V没有提供这个的模拟设备,而且ATA还没整明白,就一大堆一起搞,会把自己搞懵逼的,所以就先探测ATA硬盘了。
先用ATA设备的IDENTIFY命令获得硬盘参数
其实这个只对IDE硬盘有效,从中获得基本的参数。可以利用这个参数中初步判断硬盘是否存在。
如果IDENTIFY命令执行成功,说明硬盘可能存在,需要进行下一步的确认。比如我是从硬盘参数中获取硬盘的容量,如果容量为不为0,则初步认为硬盘是存在的。如果硬盘容量为0,我就认为硬盘不存在了,因为一个容量为0的硬盘,存在也没有意义,当然,没有装入盘片的光驱,容量有可能是0,不过我现在还没处理光驱,就当作没有了。
如果IDENTIFY命令执行失败,那可以肯定对应端口没有设备。
读硬盘的最后一个扇区进行检验
在获得硬盘容量后,我觉得还不能就立即确认硬盘存在,所以我就采用读最后一个扇区的方式进行检验。如果读最后一个扇区成功,我就认为硬盘存在。
为什么选择读最后一个扇区呢?这有两个作用。
第一个作用当然是确认硬盘存在。因为硬盘正确响应了读操作,那就说明硬盘存在了。当然不能说硬盘没有正确响应就说硬盘不存在,所以可以用RESET命令复位后重试几次,如果都没有成功,那就当作硬盘不存在了。
另一个作用是确认容量,也就是确认参数给出的硬盘容量是有效的,注意啊,我是用了有效这个词,并不是说参数正确啊。比如,有人修改了硬盘参数,如果把容量改小了,硬盘还是可以正确响应的,这个情况下,容量就是有效,而不是正确。如果把硬盘容量改大了呢?超出了硬盘的寻址范围,那自然是读失败了。这个时候,即使硬盘是存在的,由于容量错了,也必须当作硬盘不存在。