C 在用户空间中处理磁盘中断(MIT 6.828 JOS实验室5)

C 在用户空间中处理磁盘中断(MIT 6.828 JOS实验室5),c,operating-system,interrupt-handling,xv6,C,Operating System,Interrupt Handling,Xv6,我将尽力使这个问题尽可能笼统。背景是我现在正在尝试6.828 LAB 5挑战 挑战!实现中断驱动的IDE磁盘访问,包括或不包括DMA。您可以决定是否将设备驱动程序移动到内核中,将其与文件系统一起保存在用户空间中,或者甚至(如果您真的想进入微内核精神)将其移动到自己的独立环境中 我试图将驱动程序保留在用户空间中,但我发现了一个有关计时器中断的问题,请参见下面粘贴的代码,我在注释中添加的原因: int ide_read(uint32_t secno, void *dst, size_t nsecs)

我将尽力使这个问题尽可能笼统。背景是我现在正在尝试6.828 LAB 5挑战

挑战!实现中断驱动的IDE磁盘访问,包括或不包括DMA。您可以决定是否将设备驱动程序移动到内核中,将其与文件系统一起保存在用户空间中,或者甚至(如果您真的想进入微内核精神)将其移动到自己的独立环境中

我试图将驱动程序保留在用户空间中,但我发现了一个有关计时器中断的问题,请参见下面粘贴的代码,我在注释中添加的原因:

int
ide_read(uint32_t secno, void *dst, size_t nsecs)
{
    int r;

    assert(nsecs <= 256);

    ide_wait_ready(0);

    outb(0x1F2, nsecs);
    outb(0x1F3, secno & 0xFF);
    outb(0x1F4, (secno >> 8) & 0xFF);
    outb(0x1F5, (secno >> 16) & 0xFF);
    outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F));

    // between issuing disk cmd and set to sleep, there might be a timer IRQ
    // comes in, and fs -> RUNNABLE, then disk IRQ comes, and we handle it
    // then fs goes to sleep, with CPU halted, we missed wake up
    sys_ide_sleep(dst, nsecs, 0);

    return 0;
}
我想在系统调用中传递一个共享布尔变量的地址,一旦IRQ得到确认和处理,我们就设置
is_finished=true
。因此,我提出了
sys\u ide\u sleep(&is\u finished)
,在我们决定使用
sched\u yield()
生成CPU之前,我们可以进行如下检查:

if (*is_finished == false)
{
    sched_yield();
}
但我不知道是否有更优雅或更好的方法来做到这一点(我不认为以这种方式与内核共享内存是好的),任何评论或回答都将不胜感激。谢谢

if (*is_finished == false)
{
    sched_yield();
}