nexteye
驱动牛犊
驱动牛犊
  • 注册日期2006-11-28
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:1484回复:8

新旧硬盘的IO为什么会不同?我用的是同一个IDE接口。

楼主#
更多 发布于:2007-02-13 02:43
  我有一只老一点的硬盘,40G的希捷。和一只较新的80G迈拓的硬盘,用同一只程序对这两只硬盘IO。但发现旧点的硬盘可以。新硬盘根本就不可以。(我是分两次挂硬盘在同一个主IDE,程序IO端口用1f0-1f7)也就可是说除了硬盘不同外,其它的软硬件环境都相同。但最后程序运行的结果,老硬盘如我期望的执行了指定操作,新硬盘则根本就不执行。百思不得其解,
难道新老硬盘的IO端口不同?(但我理解的是端口号只和主次IDE有关,而和具体的硬盘无关)
我知道驱网里卧虎藏龙。很希望各位大侠百忙之中能抽空帮我解答一下。


在线候佳音!
hb_longbow
驱动牛犊
驱动牛犊
  • 注册日期2006-03-16
  • 最后登录2008-02-18
  • 粉丝0
  • 关注0
  • 积分240分
  • 威望35点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-13 17:12
应该是和硬盘型号没什么关系。看你具体给硬盘发的什么命令了。
nexteye
驱动牛犊
驱动牛犊
  • 注册日期2006-11-28
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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 ;发送数据.
hb_longbow
驱动牛犊
驱动牛犊
  • 注册日期2006-03-16
  • 最后登录2008-02-18
  • 粉丝0
  • 关注0
  • 积分240分
  • 威望35点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-02-14 09:47
在新硬盘上不能执行,详细的状况是怎样的?

读盘之前先把缓冲区清0,然后可以比对一下收到的是什么数据。操作完成后再读一下1F7端口,看是否发生了错误(比如值是0xD0或0x51之类),如果发生了错误,读1F1端口取一下错误码。可以找一份ATA规格参考一下。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-02-14 14:48
我测试了下,的确有问题,不过没问题的是120G硬盘,有问题的是80G硬盘,正常读MBR,一个正常,另一个却都是0006之类的数据,看来真的很奇怪.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wollok
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2012-07-18
  • 粉丝0
  • 关注0
  • 积分571分
  • 威望335点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-02-14 14:53
两个都是主通道主盘?还是一个是主盘一个是从盘?
nexteye
驱动牛犊
驱动牛犊
  • 注册日期2006-11-28
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-02-14 18:30
两个都是主通道主盘,除了硬盘,其它的几乎没什么不同了,甚至C分区大小我都设成一样。

120G的硬盘我没试过。但我在我朋友的机子上试了一下,又可以执行。而他也是80G的硬盘。会不会和厂家的硬盘具体型号有关呀。(因为我手头一只40G的迈拓硬盘试过也可以。)
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2007-02-14 22:19
注意你型号,是普通IDE的还是其他型号的,我刚发现我的硬盘是SATA的,难怪不行......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
nexteye
驱动牛犊
驱动牛犊
  • 注册日期2006-11-28
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-02-25 07:05
就是普通的IDE接口。。。实在是纳闷!会不会和KmdKit有关呀。我是用kmdKit进入ring0的。
祝大家新春愉快!虽然本人现在很郁闷!
游客

返回顶部