Linux init/main.c 初始化中硬件中断向量初始化 tra

/init/main.c部分代码

void main(void)     /* This really IS void, no error here. */   {           /* The startup routine assumes (well, ...) this */   /*    * Interrupts are still disabled. Do necessary setups, then    * enable them    */       ROOT_DEV = ORIG_ROOT_DEV;        drive_info = DRIVE_INFO;        memory_end = (1<<20) + (EXT_MEM_K<<10);        memory_end &= 0xfffff000;        if (memory_end > 16*1024*1024)            memory_end = 16*1024*1024;        if (memory_end > 12*1024*1024)             buffer_memory_end = 4*1024*1024;        else if (memory_end > 6*1024*1024)            buffer_memory_end = 2*1024*1024;        else           buffer_memory_end = 1*1024*1024;        main_memory_start = buffer_memory_end;    #ifdef RAMDISK        main_memory_start += rd_init(main_memory_start, RAMDISK*1024);    #endif        mem_init(main_memory_start,memory_end);        trap_init();        blk_dev_init();        chr_dev_init();        tty_init();        time_init();        sched_init();        buffer_init(buffer_memory_end);        hd_init();        floppy_init();        sti();        move_to_user_mode();        if (!fork()) {      /* we count on this going ok */           init();        }  

trap_init()函数位置  /kernel/traps.c

void trap_init(void)    {        int i;    //设置系统的硬件中断 中断位于kernel/asm.s 或 system_call.s        set_trap_gate(0,÷_error);//0中断,位于/kernel/asm.s 19行        set_trap_gate(1,&debug);        set_trap_gate(2,&nmi);        set_system_gate(3,&int3);   /* int3-5 can be called from all */       set_system_gate(4,&overflow);        set_system_gate(5,&bounds);        set_trap_gate(6,&invalid_op);        set_trap_gate(7,&device_not_available);        set_trap_gate(8,&double_fault);        set_trap_gate(9,&coprocessor_segment_overrun);        set_trap_gate(10,&invalid_TSS);        set_trap_gate(11,&segment_not_present);        set_trap_gate(12,&stack_segment);        set_trap_gate(13,&general_protection);        set_trap_gate(14,&page_fault);        set_trap_gate(15,&reserved);        set_trap_gate(16,&coprocessor_error);        for (i=17;i<48;i++)            set_trap_gate(i,&reserved);        set_trap_gate(45,&irq13);        outb_p(inb_p(0x21)&0xfb,0x21);        outb(inb_p(0xA1)&0xdf,0xA1);        set_trap_gate(39,¶llel_interrupt);    }  

set_trap_gate()函数位于/include/asm/system.h

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxpfg.html