使用组件访问硬盘驱动器

时间:2011-12-11 01:48:06

标签: assembly bios

我在哪里可以找到如何直接从汇编处理硬盘驱动器(假设我在实模式下运行或响铃0)。例如,我想将数据从100-200加载到ram中的某个位置。我如何处理特定硬盘驱动器以及如何告诉驱动器我想要哪些扇区?

2 个答案:

答案 0 :(得分:3)

我同意@joev使用BIOS调用可能是最简单的事情,但如果你想自己动手,似乎你想要直接访问硬件。

对于PATA控制器(或设置为兼容模式的SATA),您可以使用PIO进行简单的数据访问。 OS Dev wiki在这里有一篇很深入的文章:http://wiki.osdev.org/ATA_PIO_Mode

您可以通过传统I / O端口0x1f0-0x1f7(主要)和0x170-0x177(次要)访问控制器。以下阅读示例来自Wiki页面:

  
      
  1. 发送“master”的0xE0或“slave”的0xF0,将LBA的最高4位与端口0x1F6进行或运算:outb(0x1F6,0xE0 |(slavebit<< 4)|((LBA> ;> 24)& 0x0F))
  2.   
  3. 如果你愿意,将一个空字节发送到端口0x1F1(它会被忽略并浪费大量的CPU时间):outb(0x1F1,0x00)
  4.   
  5. 将sectorcount发送到端口0x1F2:outb(0x1F2,(unsigned char)count)
  6.   
  7. 将LBA的低8位发送到端口0x1F3:outb(0x1F3,(unsigned char)LBA))
  8.   
  9. 将LBA的下一个8位发送到端口0x1F4:outb(0x1F4,(无符号字符)(LBA>> 8))
  10.   
  11. 将LBA的下一个8位发送到端口0x1F5:outb(0x1F5,(无符号字符)(LBA>> 16))
  12.   
  13. 将“READ SECTORS”命令(0x20)发送到端口0x1F7:outb(0x1F7,0x20)
  14.   
  15. 等待IRQ或民意调查。
  16.   
  17. 从I / O端口0x1F0一次将256个字(一个字一个字)传送到缓冲区。 (在汇编程序中,REP INSW适用于此。)
  18.   
  19. 然后循环回等待每个连续扇区的下一个IRQ(或再次轮询 - 见下一个注释)。
  20.   

还有更复杂的方式来访问驱动器(MMIO,更复杂的PIO模式,DMA模式等),但这绝对是一个很好的起点。

答案 1 :(得分:2)

恐龙在地球上漫游的方式是使用“INT 13H”BIOS调用,AH设置为02H。它可能甚至不适用于SATA时代的现代PC。

查找更多信息here。如果您在问题中提供更多详细信息(例如,您使用某种操作系统,或者这是某种“滚动自己的”项目),您可能会得到更好的答案吗?)