Os Dev 的 PCI IDE 教程中的 insl 函数是做什么用的?

问题描述 投票:0回答:2

这是调用insl的函数。

void ide_read_buffer(unsigned char channel, unsigned char reg, unsigned int buffer,
                     unsigned int quads) {
   /* WARNING: This code contains a serious bug. The inline assembly trashes ES and
    *           ESP for all of the code the compiler generates between the inline
    *           assembly blocks.
    */
   if (reg > 0x07 && reg < 0x0C)
      ide_write(channel, ATA_REG_CONTROL, 0x80 | channels[channel].nIEN);
   asm("pushw %es; movw %ds, %ax; movw %ax, %es");
   if (reg < 0x08)
      insl(channels[channel].base  + reg - 0x00, buffer, quads);
   else if (reg < 0x0C)
      insl(channels[channel].base  + reg - 0x06, buffer, quads);
   else if (reg < 0x0E)
      insl(channels[channel].ctrl  + reg - 0x0A, buffer, quads);
   else if (reg < 0x16)
      insl(channels[channel].bmide + reg - 0x0E, buffer, quads);
   asm("popw %es;");
   if (reg > 0x07 && reg < 0x0C)
      ide_write(channel, ATA_REG_CONTROL, channels[channel].nIEN);
}

链接在这里,https://wiki.osdev.org/PCI_IDE_Controller#Commands

c assembly x86 osdev ata
2个回答
6
投票

Os Dev 的 PCI IDE 教程中的 insl 函数有什么作用?

void ide_read_buffer(... unsigned int buffer ...)

很清楚为什么你看不懂代码:

unsigned int buffer
显然是教程代码中的一个错误。应该是
unsigned int * buffer

现在很清楚

insl
的作用:它从第一个参数中给出的端口读取
quad
次,并将结果写入数组
buffer

函数的黑盒行为可以用以下方式解释:

void insl(unsigned reg, unsigned int *buffer, int quads)
{
    int index;
    for(index = 0; index < quads; index++)
    {
        buffer[index] = inl(reg);
    }
}

0
投票

我只是在寻找解释。在 init_ide() 函数中传递给函数的缓冲区大小为 2048,有时,在“自制”操作系统中,指针类型会被忽略,并作为普通整数传递给函数,可能是为了更容易与汇编集成。

© www.soinside.com 2019 - 2024. All rights reserved.