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

怎样用I/O去读写连续的扇区?

楼主#
更多 发布于:2007-02-25 05:36
请各位大侠帮我看一下我的代码,错在哪里了?我已获取ring0
我想把数据写入到1,2扇区。但不行,不知道错在哪儿了?
mov     dx,1f6h         ; 要读入的磁盘号及磁头号
mov     al,0a0h         ; 磁盘0,磁头0
out      dx,al

mov     dx,1f2h         ; 要写的扇区数量
;*************************************************
mov     al,2               ; 写两个扇区      (写两扇区是mov al,2吗?)
;*************************************************
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        ;设置循环次数(512/2)  
mov     si,buffer
mov     dx,1f0h         ;数据端口,用来存放要发送的数据.
rep      outsw           ;发送数据.

如果单独写第1或第2扇区,程序都可以正确执行。但连续写2扇区,程序却不执行,我怀疑是1f2h端口的的含义让我搞错了。但我手头也没资料可以查。(也不知道怎么查,呵呵)假设buffer长度为1024。
程序其它代码不变。(当然如果是写一扇区,cx为512/2,呵呵)

有哪位大侠知道ATA手册可以下载或阅读的,麻烦发个链接。谢谢了。
祝大伙新春愉快!
nexteye
驱动牛犊
驱动牛犊
  • 注册日期2006-11-28
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-25 06:53
我在win2000下试了一下却可以,奇怪!
为什么XP2就不行呢?
老遇见奇怪的问题,前几天碰到80G硬盘的问题还没想通,现在又来了这么个奇怪的问题。
hb_longbow
驱动牛犊
驱动牛犊
  • 注册日期2006-03-16
  • 最后登录2008-02-18
  • 粉丝0
  • 关注0
  • 积分240分
  • 威望35点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-02-27 09:50
www.t13.org

你用的ATA命令(发往1f7端口的30h)印象中好像是单扇区命令,就是每传送完一个扇区,都要处理IRQ的。即便系统能自动替你处理,硬盘也需要一个等待数据准备好的时间。
nexteye
驱动牛犊
驱动牛犊
  • 注册日期2006-11-28
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-01 02:03
谢谢hb_longbow的提醒,我找到答案了.再次感谢!
游客

返回顶部