gpt4 book ai didi

assembly - 使用程序集访问硬盘驱动器

转载 作者:行者123 更新时间:2023-12-02 01:54:07 26 4
gpt4 key购买 nike

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

最佳答案

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

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

您可以通过旧版 I/O 端口 0x1f0-0x1f7(主)和 0x170-0x177(辅助)访问 Controller 。以下读取示例来自 wiki 页面:

  1. Send 0xE0 for the "master" or 0xF0 for the "slave", ORed with the highest 4 bits of the LBA to port 0x1F6: outb(0x1F6, 0xE0 | (slavebit << 4) | ((LBA >> 24) & 0x0F))
  2. Send a NULL byte to port 0x1F1, if you like (it is ignored and wastes lots of CPU time): outb(0x1F1, 0x00)
  3. Send the sectorcount to port 0x1F2: outb(0x1F2, (unsigned char) count)
  4. Send the low 8 bits of the LBA to port 0x1F3: outb(0x1F3, (unsigned char) LBA))
  5. Send the next 8 bits of the LBA to port 0x1F4: outb(0x1F4, (unsigned char)(LBA >> 8))
  6. Send the next 8 bits of the LBA to port 0x1F5: outb(0x1F5, (unsigned char)(LBA >> 16))
  7. Send the "READ SECTORS" command (0x20) to port 0x1F7: outb(0x1F7, 0x20)
  8. Wait for an IRQ or poll.
  9. Transfer 256 words, a word at a time, into your buffer from I/O port 0x1F0. (In assembler, REP INSW works well for this.)
  10. Then loop back to waiting for the next IRQ (or poll again -- see next note) for each successive sector.

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

关于assembly - 使用程序集访问硬盘驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com