汇编程序+ C或我无法中断工作

时间:2016-09-23 23:30:38

标签: c assembly operating-system interrupt

帮助,我运行操作系统,它崩溃了! IDT Loadet正常。我做错了什么?真的很难!我需要在保护模式下编写操作系统!

    #define IT 0x000000
    #define IR 0x000800
    #define SCS 0x8
    #define IRQ_HANDLER(func) void func (void)\
     {asm(#func ": pusha \n call _" #func " \n movb $0x20, %al \n outb %al, $0x20 \n popa \n iret \n");}\
     void _ ## func(void)
        void init_interrupts() {
            int i=0;
            unsigned short *ir=IR;
            for(i=0;i<256*8;i++){
                *(ir+i)=0;
            }
            *(ir)=256*8-1;
            *(ir+2)=(IT &0xFFFF0000)>>16;
            *(ir+4)=(IT&0x0000FFFF);
            set_int_handler(0x20, timer_int_handler, 0x8E);
            //set_int_handler(0x21, print_c, 0x8E);
            asm("lidt 0(,%0,)"::"a"(IR));
            opb(0x21,0xfd);
           opb(0xa1,0xff);
            opb(0x20,0x20); opb(0xa0,0x20);
            asm("sti");
        }

        void set_int_handler(char index, void *handler, char type) {
        asm("pushf \n cli");
        char *ad=IT;
        *(ad+index*8)=(char)(handler)&0x000000FF;
        *(ad+index*8+1)=((char)(handler)&0x0000FF00)>>8;
        *(ad+index*8+2)=0x8;
        *(ad+index*8+3)=0;
        *(ad+index*8+4)=0;
        *(ad+index*8+5)=type;
        *(ad+index*8+6)=((char)(handler)&0x00FF0000)>>16;
        *(ad+index*8+7)=((char)(handler)&0xFF000000)>>24;   
        asm("popf"); 
    }
    ...


我不知道该怎么做!

1 个答案:

答案 0 :(得分:3)

首先,大多数编译器都以这种或那种方式允许您create an ISR directly

其次,你应该从头开始捕捉所有内容,除非你希望系统崩溃在第一个未处理或虚假的中断(最初看起来似乎正在发生)。

正确的中断处理子系统可以使代码更加清晰和便携,允许您探测哑巴(如ISA)的IRQ并干净地路由共享的IRQ。

大多数仿真器都支持GDB协议,并允许您轻松调试此类故障。例如,您可以使用-d int-no-reboot启动QEMU来调试此类问题,一旦发生故障,您可以从调试器中检查它。您可以在QEMU Wikibook中找到一些入门指南。您可能还想尝试BOCHS,它带有一个内部调试器,在低级别的东西更好,仿真有时更准确。