使GCC使用iret而不是ret

bprjcwpo  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(130)

我尝试在我的简单操作系统中使用中断。我已经成功地设置了IDT,并在汇编中制作了一个C函数来设置门(如下所示),但现在我遇到了一个问题:如何用C语言编写以iret结尾的中断处理程序?下面是我的代码:

setGate: ;the first argument is the gate number
         ;the second the address to the function
push ebp
mov  ebp, esp
push eax
push ebx

mov  eax, [ebp+12]
mov  ebx, idtStart
add  ebx, [ebp+8]
mov  [ebx*8], ax
mov  word [ebx*8+2], 0x8
mov  word [ebx*8+4], 0x8E00
shr  eax, 16
mov  [ebx*8+6], ax

pop  ebx
pop  eax
pop  ebp
ret

我的C代码是:

void handler(void)
{
    print("The interrupt has been handled", 15, 0);
}

void main(void)
{
    loadIDT();
    setGate(32, (unsigned long)&handler);
    __asm__("int $32");
}

这段代码会导致操作系统崩溃,但是当我使用汇编和iret时,它不会崩溃。
我正在用GCC和Nasm编译,并在Qemu上进行模拟,处于32位保护模式。

ajsxfq5m

ajsxfq5m1#

正如Michael Petch所建议的那样,我的中断处理程序/函数上的__attribute__((interrupt))__适合我的情况。
不幸的是,由于这是五年前的事了,我不能给予更多的细节,当时我对解决方案非常满意。

相关问题