阅读:1484回复:8
新旧硬盘的IO为什么会不同?我用的是同一个IDE接口。
我有一只老一点的硬盘,40G的希捷。和一只较新的80G迈拓的硬盘,用同一只程序对这两只硬盘IO。但发现旧点的硬盘可以。新硬盘根本就不可以。(我是分两次挂硬盘在同一个主IDE,程序IO端口用1f0-1f7)也就可是说除了硬盘不同外,其它的软硬件环境都相同。但最后程序运行的结果,老硬盘如我期望的执行了指定操作,新硬盘则根本就不执行。百思不得其解,
难道新老硬盘的IO端口不同?(但我理解的是端口号只和主次IDE有关,而和具体的硬盘无关) 我知道驱网里卧虎藏龙。很希望各位大侠百忙之中能抽空帮我解答一下。 在线候佳音! |
|
沙发#
发布于:2007-02-13 17:12
应该是和硬盘型号没什么关系。看你具体给硬盘发的什么命令了。
|
|
板凳#
发布于:2007-02-13 19:51
但事实就是只和硬盘有关系,操作系统我都是ghost过来的。除了硬盘外,没什么不同了。
我的IO指令是这样的。(原版的作者是风一样的男人) ;以下代码用I/O端口来读主引导区 mov dx,1f6h ; 要读入的磁盘号及磁头号 mov al,0a0h ;磁盘0,磁头0 out dx,al mov dx,1f2h ;要读入的扇区数量 mov al,1 ;读一个扇区 out dx,al mov dx,1f3h ;要读的扇区号 mov al,1 ;扇区号为1 out dx,al mov dx,1f4h ;要读的柱面的低8位 mov al,0 ; 柱面低8位为0 out dx,al mov dx,1f5h ; 柱面高2位 mov al,0 ; 柱面高2位为0(通过1F4H和1F5H端口我们可以确定 ; 用来读的柱面号是0) out dx,al mov dx,1f7h ;命令端口 mov al,20h ; 尝试读取扇区 out dx,al still_going: in al,dx test al,8 ;扇区缓冲是否准备好 jz still_going ;如果扇区缓冲没有准备好的话则跳转,直到准备好才向下执行。 mov cx,512/2 ;设置循环次数(512/2次) mov di,offset buffer mov dx,1f0h ;将要传输的一个字节的数据 rep insw ;传输数据 (省略和IO无关代码) ;以下代码用I/O端口来写主引导区 mov dx,1f6h ; 要读入的磁盘号及磁头号 mov al,0a0h ; 磁盘0,磁头0 out dx,al mov dx,1f2h ; 要写的扇区数量 mov al,1 ; 写一个扇区 out dx,al mov dx,1f3h ;要写的扇区号 mov al,1 ;写到1扇区 out dx,al mov dx,1f4h ; 要写的柱面的低8位 mov al,0 ; 低8位为0 out dx,al mov dx,1f5h ; 要写的柱面的高2位 mov al,0 ; 高2位为0 out dx,al mov dx,1f7h ;命令端口 mov al,30h ;尝试着写扇区. out dx,al oogle: in al,dx test al,8 ;磁盘扇区缓冲是否准备好 jz oogle mov cx,512/2 ;设置循环次数(512/2) mov si,buffer mov dx,1f0h ;数据端口,用来存放要发送的数据. rep outsw ;发送数据. |
|
地板#
发布于:2007-02-14 09:47
在新硬盘上不能执行,详细的状况是怎样的?
读盘之前先把缓冲区清0,然后可以比对一下收到的是什么数据。操作完成后再读一下1F7端口,看是否发生了错误(比如值是0xD0或0x51之类),如果发生了错误,读1F1端口取一下错误码。可以找一份ATA规格参考一下。 |
|
地下室#
发布于:2007-02-14 14:48
我测试了下,的确有问题,不过没问题的是120G硬盘,有问题的是80G硬盘,正常读MBR,一个正常,另一个却都是0006之类的数据,看来真的很奇怪.
|
|
|
5楼#
发布于:2007-02-14 14:53
两个都是主通道主盘?还是一个是主盘一个是从盘?
|
|
6楼#
发布于:2007-02-14 18:30
两个都是主通道主盘,除了硬盘,其它的几乎没什么不同了,甚至C分区大小我都设成一样。
120G的硬盘我没试过。但我在我朋友的机子上试了一下,又可以执行。而他也是80G的硬盘。会不会和厂家的硬盘具体型号有关呀。(因为我手头一只40G的迈拓硬盘试过也可以。) |
|
7楼#
发布于:2007-02-14 22:19
注意你型号,是普通IDE的还是其他型号的,我刚发现我的硬盘是SATA的,难怪不行......
|
|
|
8楼#
发布于:2007-02-25 07:05
就是普通的IDE接口。。。实在是纳闷!会不会和KmdKit有关呀。我是用kmdKit进入ring0的。
祝大家新春愉快!虽然本人现在很郁闷! |
|