这是调用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。
2条答案
按热度按时间au9on6nz1#
函数insl在OS Dev的PCI IDE教程中做什么?
字符串
很明显你不理解代码的原因:
unsigned int buffer
显然是教程代码中的一个bug。它应该是unsigned int * buffer
。现在清楚了
insl
的作用:它从第一个参数中给出的端口读取quad
次,并将结果写入数组buffer
。函数的黑盒行为可以用以下方式解释:
型
busg9geu2#
我只是在搜索explain. Buffer,在init_ide()函数中传递给函数的大小是2048,有时,在“自制”操作系统中,指针类型被忽略,并作为普通整数传递给函数,可能是为了更容易与汇编集成。