探测硬盘是否存在

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命令复位后重试几次,如果都没有成功,那就当作硬盘不存在了。

另一个作用是确认容量,也就是确认参数给出的硬盘容量是有效的,注意啊,我是用了有效这个词,并不是说参数正确啊。比如,有人修改了硬盘参数,如果把容量改小了,硬盘还是可以正确响应的,这个情况下,容量就是有效,而不是正确。如果把硬盘容量改大了呢?超出了硬盘的寻址范围,那自然是读失败了。这个时候,即使硬盘是存在的,由于容量错了,也必须当作硬盘不存在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值