当前位置: 代码迷 >> 汇编语言 >> windows的底层是怎么实现磁盘读写的
  详细解决方案

windows的底层是怎么实现磁盘读写的

热度:10209   发布时间:2013-02-26 00:00:00.0
windows的底层是如何实现磁盘读写的?
一、个人分析:
1.如果使用INT   13,那么它是16位代码,就意味着读到的数据必须要放到最低的1M内存中,如此一来,当文件非常大时,会多次读写,显然效率地下。
2.如果把int   13的过程的代码放到了自己的地址空间,对应一些IDT表项,倒是说得过去。
3.如果采用端口读写,倒是还可以,不过我感觉windows不是通过端口读写磁盘的,因为冰点还原精灵是通过截获中断来实施磁盘保护的,估计是截获的int   13。不过也可能是截获的IDT的int   13,如果如此,还真可能是通过端口读写实现的。
二、求硬盘端口(1f0~1f8)的详细资料

------解决方案--------------------------------------------------------
通过端口读写,不过这好像涉及硬盘工作模式,如果是在PIO4模式下肯定是端口,DMA模式的硬盘没有试过。

以前在研究StarForce的保护时曾经发现Win32API的封装仍然比较上层,即便是cdrom.sys驱动,也只是端口读写调用的封装。
------解决方案--------------------------------------------------------
==================================================================
相关链接:
http://www.cnblogs.com/huqingyu/archive/2005/02/27/110013

http://bbs.driverdevelop.com/htm_data/45/0703/99537

http://www.retcvc.com/cgi-bin/topic.cgi?forum=1&topic=1778

http://my.poco.cn/myBlogDetail-htx-id-692500-userid-37626199-pri--n-0.shtml

http://www.retcvc.com/cgi-bin/topic.cgi?forum=12&topic=45&show=125


====================================================================================

对硬盘进行操作的常用端口是1f0h~1f7h号端口,各端口含义如下:
端口号 读还是写 具体含义
1F0H 读/写 用来传送读/写的数据(其内容是正在传输的一个字节的数据)
1F1H 读 用来读取错误码
1F2H 读/写 用来放入要读写的扇区数量
1F3H 读/写 用来放入要读写的扇区号码
1F4H 读/写 用来存放读写柱面的低8位字节
1F5H 读/写 用来存放读写柱面的高2位字节(其高6位恒为0)
1F6H 读/写 用来存放要读/写的磁盘号及磁头号
第7位 恒为1
第6位 恒为0
第5位 恒为1
第4位 为0代表第一块硬盘、为1代表第二块硬盘
第3~0位 用来存放要读/写的磁头号
1f7H 读 用来存放读操作后的状态
第7位 控制器忙碌
第6位 磁盘驱动器准备好了
第5位 写入错误
第4位 搜索完成
第3位 为1时扇区缓冲区没有准备好
第2位 是否正确读取磁盘数据
第1位 磁盘每转一周将此位设为1,
第0位 之前的命令因发生错误而结束
写 该位端口为命令端口,用来发出指定命令
为50h 格式化磁道
为20h 尝试读取扇区
为21h 无须验证扇区是否准备好而直接读扇区
为22h 尝试读取长扇区(用于早期的硬盘,每扇可能不是512字节,而是

128字节到1024之间的值)
为23h 无须验证扇区是否准备好而直接读长扇区
为30h 尝试写扇区
为31h 无须验证扇区是否准备好而直接写扇区
为32h 尝试写长扇区
为33h 无须验证扇区是否准备好而直接写长扇区
注:当然看完这个表你会发现,这种读写端口的方法其实是基于磁头、柱面、扇区的硬盘读写方法

,不过大于8G的硬盘的读写方法也是通过端口1F0H~1F7H来实现的^_^
------解决方案--------------------------------------------------------
倒是有份英文的系统端口与中断资料,不知对你是否有帮助,已经发送过去了
------解决方案--------------------------------------------------------
HDD 分PATA/SATA/AHCI,windows的底层实现磁盘读写的,是靠驱动,驱动基于硬件,所以,如果是PATA/SATA,那就是通过I/O端口来操作的。AHCI是通过MEMORY来实现的。在CMOS里面的选项分别是 legacy IDE(PATA) Native IDE(sata),AHCI. (RAID不是一种硬件,是一种硬盘管理模式。)驱动是32位的保护模式。
  相关解决方案