Operating system 如何配置ATA硬盘以开始生成中断?

Operating system 如何配置ATA硬盘以开始生成中断?,operating-system,x86,device-driver,Operating System,X86,Device Driver,已解决 在经历了许多困惑和挫折之后,我终于让我的硬盘中断了这基本上归结为我一直在读状态寄存器,而不是备用状态寄存器。其他一些东西在启动时都被弄糟了,但关键是我的硬盘驱动程序终于开始成形了。现在,对于其他人,我将离开原来的帖子 另外,为了进一步澄清,我不需要发出任何重置命令。我所做的只是: 选择设备(不想杀死另一个磁盘上的Solaris操作系统) 清除设备控制寄存器中的nIEN位 发出标识设备命令*** 实际上,我不确定是否需要identifieddevice命令,因为我在没有发出该命令的情况下就

已解决

在经历了许多困惑和挫折之后,我终于让我的硬盘中断了这基本上归结为我一直在读状态寄存器,而不是备用状态寄存器。其他一些东西在启动时都被弄糟了,但关键是我的硬盘驱动程序终于开始成形了。现在,对于其他人,我将离开原来的帖子

另外,为了进一步澄清,我不需要发出任何重置命令。我所做的只是:

  • 选择设备(不想杀死另一个磁盘上的Solaris操作系统)
  • 清除设备控制寄存器中的nIEN位
  • 发出标识设备命令***
  • 实际上,我不确定是否需要identifieddevice命令,因为我在没有发出该命令的情况下就可以测试代码了,所以我很高兴地离开了实验室。然而,主要的一点是,我需要确保读取备用状态寄存器,并在不需要重置的情况下清除nIEN位。BIOS显然处理了大部分内容


    我目前正试图为学校正在开发的一个业余操作系统编写一个磁盘驱动程序。目前,我有读取/写入PCI配置空间中数据的例程,以及使用ATA/ATAPI-7定义的各种寄存器执行端口IO的汇编例程。现在,我的问题是,具体来说,我如何让IDE硬盘开始产生中断?我已经阅读了所有这些文档,但还不清楚我做错了什么

    有人能确切地解释是什么导致IDE硬盘开始产生中断吗?我已经有了一个中断服务例程可以测试了,但是我首先很难获得中断。这可以通过ATA软复位来实现吗

    谢谢


    更新:好的,我可以通过设置设备控制寄存器中的SRST位进行软复位来获得辅助通道,一个ATAPI CDROM来生成中断。这不适用于主通道上的硬盘。到目前为止,我注意到,当我为硬盘设置SRST位时,它设置BSY位并保持设置。从那里我不知道该怎么办。

    如果这只是一个爱好操作系统,为什么不使用BIOS中断(int 13h)?诚然,速度不如直接访问磁盘,但对硬盘更安全(在处理磁盘I/O之前,我已将读磁头穿过了一块板)。

    此参考资料应该会对您有所帮助:

    启用中断的基本机制是清除DCR(设备控制寄存器)中的nIEN:

    nIEN:驱动中断启用位。主机驱动器中断的启用位。当nIEN为0或选择驱动器时,主机中断信号INTRQ通过主机的三态缓冲器启用。当nIEN为1或未选择驱动器时,主机中断信号INTRQ处于高阻抗状态,无论是否存在挂起的中断

    这是一个很好的起点,可以找到比您想知道的更多关于ATA/PATA/SATA/ATAPI的信息。。。请注意,正式的ATA-6/7/etc规范从T13开始需要花费$,不过您可以从他们那里下载当前的ATA-8草案


    这描述了ATA设备与规格不同的几种方式。(我曾经为Commodore/Amiga编写SCSI和ATA/ATAPI驱动程序,这要追溯到什么时候,以及帮助鉴定驱动器——或者更准确地说,是为了弄清楚驱动器制造商做了什么。)

    您是否看过BSD/Linux IDE驱动程序,它们是如何处理驱动器的?源代码是公开的。是的,但是Linux与我们的系统相比太复杂了,这是一项非常艰巨的任务。这是我偶尔会问的问题之一,没有人真正知道。在像OSDev这样的地方,这可能会更好。是的,OSDev的一些人有很好的信息。起初我考虑过这一点,但希望能够在保护模式下访问磁盘。这是可能的。要从保护模式调用int 13h,我想你必须打一个回合。。。这可能是错误的,但我认为你在ring0中运行你的int 13h呼叫,然后从ring3 IIRC中调用这是M$对HAL的作用。谢谢你的精彩帖子!尽管我认为我的问题归结为读取状态寄存器(它清除中断)而不是alt.status.Yup,但您需要小心这些读取。很高兴能帮上忙是的,那是肯定的!。我必须说,这个磁盘驱动程序项目是我在大学里从事过的最有价值、最复杂的项目。很容易理解为什么我们在上个季度开始编写一个简单的串行设备,因为像这样的东西要复杂得多。