我尝试在我的简单操作系统中使用中断。我已经成功地设置了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位保护模式。
1条答案
按热度按时间ajsxfq5m1#
正如Michael Petch所建议的那样,我的中断处理程序/函数上的
__attribute__((interrupt))__
适合我的情况。不幸的是,由于这是五年前的事了,我不能给予更多的细节,当时我对解决方案非常满意。