AHCI 与 IDE

来源:互联网 发布:苹果手机怎么恢复备份数据 编辑:程序博客网 时间:2024/05/07 17:59

之前写的一篇文章里设计到DOS下读写硬盘信心,之后经过仔细验证发现,IDE的访问方式和AHCI的访问方式完全不一样,因而前文提到的兼容IDE与AHCI是不对的。我之前之所以认为二者可以做到兼容,是因为AHCI技术刚出来的时候,IDE模式下的硬盘兼容了AHCI模式,也就是用IDE的方式来模拟AHCI的功能,因而那时候的AHCI其本质仍然是IDE,所以可以通过访问IDE硬盘的方式来访问AHCI模式下的硬盘,所以我那台很老的笔记本选择AHCI模式的时候我依然可以用IDE的方式来访问。后来的AHCI模式则脱离了IDE模式,但是AHCI模式可以兼容IDE模式,所以在新机器上验证我的工具时,就访问不了AHCI模式的硬盘。

AHCI与IDE的主要区别是,IDE模式的硬盘可以往IO端口下命令来访问,而AHCI模式下的硬盘则不能使用单个的命令来访问,它使用的是数据包的方式。

当然二者都依然可以使用扩展int 13h来访问硬盘,不过这只能获取部分硬盘参数,而不能获取全部的硬盘信息,至于扩展int 13h具备哪些功能,你可以Google一下,此处不再浪费笔墨。

有一点要注意,使用中断的时候,会牵涉你所使用的编译器。不同的编译器对于中断的处理是不一样的,当然这不仅仅是指编译器的API。因为对于某些中断而言,在保护模式下是不能使用的,它们只能在实模式下能使用,比如int 13H。

DOS本身是16位的实模式,当然可以通过打开A10 gate来进入保护模式。代码如下:

 

  

在DOS时代,为了使DOS程序具备更多的寻址空间,某些编译器自身就加入了32位的DOS内核,比如watcom,watcom有两个32位的DOS内核:DOS32a和DOS32GW。 这两个内核的区别是:DOS32a可以link到DOS程序里面,而DOS32GW则不行,所以使用DOS32GW的程序不能单独使用,必须和DOS32GW.exe一起使用。在早期的一些DOS程序的开始会有DOS32GW字样,那就是watcom编译的。

如果要在保护模式下使用int13H中断,必须要借助DPMI(DOS保护模式接口),也就是要借助int31H的0x300功能来模拟实模式中断int13。

再简单说一下watcom编译器。watcom编译器是最早支持保护模式的编译器。不过在watcom的早期版本里,好像不能设置实模式编程,我之前使用的watcom 1.6就不支持实模式编程,现在watcom1.9已经支持了实模式编程。使用"wcl -l=dos file.c"就可以实模式编程,使用保护模式的命令是“wcl386 -l=dos32a file.c”或者“wcl386 -l=dos32gw file.c”。最新版本的watcom可以到watcom的官网上下载:

www.openwatcom.org。