《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.5 异常处理类中断服务程序挂接...

    xiaoxiao2022-05-22  250

    2.5 异常处理类中断服务程序挂接

    不论是用户进程还是系统内核都要经常使用中断或遇到很多异常情况需要处理,如CPU在参与运算过程中,可能会遇到除零错误、溢出错误、边界检查错误、缺页错误……免不了需要“异常处理”。中断技术也是广泛使用的,系统调用就是利用中断技术实现的。这些中断、异常都需要具体的服务程序来执行。trap_init()函数将中断、异常处理的服务程序与IDT进行挂接,逐步重建中断服务体系,支持内核、进程在主机中的运算。挂接的具体过程及异常处理类中断服务程序在IDT中所占用的位置如图2-6所示。

    执行代码如下:

    //代码路径:init/main.c: void main(void) { … trap_init(); … } //代码路径:kernel/traps.c: void trap_init(void) { int i; set_trap_gate(0,÷_error);//除零错误 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); //无效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); //允许IRQ2中断请求 outb(inb_p(0xA1)&0xdf,0xA1); // 允许IRQ2中断请求 set_trap_gate(39,¶llel_interrupt); //并口 } //代码路径:include\asm\system.h: … #define _set_gate(gate_addr,type,dpl,addr) \ __asm__("movw %%dx,%%ax\n\t" \ //将edx的低字赋值给eax的低字 "movw %0,%%dx\n\t" \ //%0对应第二个冒号后的第1行的"i" "movl %
    转载请注明原文地址: https://yun.8miu.com/read-11387.html

    最新回复(0)