windows的底层是如何实现磁盘读写的?

mengshijie_1981 2007-07-24 03:46:36
一、个人分析:
1.如果使用INT 13,那么它是16位代码,就意味着读到的数据必须要放到最低的1M内存中,如此一来,当文件非常大时,会多次读写,显然效率地下。
2.如果把int 13的过程的代码放到了自己的地址空间,对应一些IDT表项,倒是说得过去。
3.如果采用端口读写,倒是还可以,不过我感觉windows不是通过端口读写磁盘的,因为冰点还原精灵是通过截获中断来实施磁盘保护的,估计是截获的int 13。不过也可能是截获的IDT的int 13,如果如此,还真可能是通过端口读写实现的。
二、求硬盘端口(1f0~1f8)的详细资料
...全文
881 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
0xAA55 2011-10-30
  • 打赏
  • 举报
回复
别忘了,16位代码可以打开A20地址线,通过66H,67H前缀进行高位内存操作!
INT 13H也有扩展功能,使用LBA进行大于8G的硬盘读写!!

啊~~肚子疼~~
MPTD_Fire 2007-07-25
  • 打赏
  • 举报
回复
学习
ReverseEngineering 2007-07-25
  • 打赏
  • 举报
回复
学习一下
mengshijie_1981 2007-07-24
  • 打赏
  • 举报
回复
我知道windows靠驱动,驱动也是代码,既然驱动是基于I/0端口的,也就是说windows使用端口来访问硬盘,这个驱动虽然是靠I/O端口完成,我还是认为I/O端口也是基于IDT中断的,就是说驱动仍然是中断触发的,否则冰点还原精灵就无法保护磁盘了。因为听说冰点是靠屏蔽中断来实现磁盘保护的。综上所述,得出结论,windows自己建立了磁盘的相关中断例程,而没有使用BIOS提供的INT 13。也就是说,写系统必须要自己编写使用端口访问磁盘的磁盘中断处理例程。再把入口对准IDT的条目。
ui_ppoppopp 2007-07-24
  • 打赏
  • 举报
回复
HDD 分PATA/SATA/AHCI,windows的底层实现磁盘读写的,是靠驱动,驱动基于硬件,所以,如果是PATA/SATA,那就是通过I/O端口来操作的。AHCI是通过MEMORY来实现的。在CMOS里面的选项分别是 legacy IDE(PATA) Native IDE(sata),AHCI. (RAID不是一种硬件,是一种硬盘管理模式。)驱动是32位的保护模式。
czlyc006 2007-07-24
  • 打赏
  • 举报
回复
倒是有份英文的系统端口与中断资料,不知对你是否有帮助,已经发送过去了
mengshijie_1981 2007-07-24
  • 打赏
  • 举报
回复
多谢大家的解答,再等等…,稍后结贴!
hkbyest 2007-07-24
  • 打赏
  • 举报
回复
==================================================================
相关链接:
http://www.cnblogs.com/huqingyu/archive/2005/02/27/110013.html

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

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来实现的^_^
mengshijie_1981 2007-07-24
  • 打赏
  • 举报
回复
LS的兄弟能给点硬盘端口的资料吗?我在百度和谷歌查了很久也没有找到一点有价值资料。
我的邮箱:
mengshijie_1981@sina.com
czlyc006 2007-07-24
  • 打赏
  • 举报
回复
通过端口读写,不过这好像涉及硬盘工作模式,如果是在PIO4模式下肯定是端口,DMA模式的硬盘没有试过。

以前在研究StarForce的保护时曾经发现Win32API的封装仍然比较上层,即便是cdrom.sys驱动,也只是端口读写调用的封装。

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧