C 文件·traps.c
是 Linux 内核的一部分,主要处理硬件陷阱和故障。文件中包含多个函数来处理不同类型的异常和错误。下面是详细的解析:
概览
- 目的:此文件负责处理各种硬件异常和故障。它包括了处理特定类型错误以及初始化异常处理器的函数。
- 文件结构:文件以描述目的和版权信息的注释开头,接着包含了必要的头文件,并定义了一些用于访问内存段的宏。
关键函数
1. die
- 描述:一个辅助函数,用于打印关于异常的诊断信息并退出进程。
- 使用:
打印错误类型、寄存器和其他相关信息。
调用 do_exit 并传入状态码 11 来终止进程。
2. 异常处理函数
这些函数在发生特定的硬件异常时被调用。它们通常会调用 die 函数来打印诊断信息并终止进程。
do_double_fault
- 描述:处理双故障异常。
- 参数:esp(指向栈的指针),
error_code
。
do_general_protection
- 描述:处理一般保护故障。
- 参数:
esp
(指向栈的指针),error_code
。
do_divide_error
- 描述:处理除零错误。
- 参数:esp(指向栈的指针),error_code。
do_int3
- 描述:处理
INT3
指令(软件断点)。 - 参数:寄存器和段描述符。
- 描述:处理
do_nmi,
do_debug
,do_overflow
,do_bounds
,do_invalid_op
,do_device_not_available
,do_coprocessor_segment_overrun
,do_invalid_TSS
,do_segment_not_present
,do_stack_segment
,do_coprocessor_error,
**
这些函数分别处理非屏蔽中断、调试异常、溢出、边界越界、无效操作、设备不可用、协处理器段越界、无效的任务状态段、段不存在、堆栈段错误以及协处理器错误等异常情况。每个函数都会根据具体的异常类型采取相应的处理措施,通常是调用 die 函数来打印错误信息并终止进程。
3. trap_init
-
详细解释
trap_init()
函数负责初始化一个计算机系统的中断和异常处理程序。它通过设置不同类型的门(gate)
来指定对于特定类型的中断或异常应调用哪个处理函数。 -
门
(Gate)
说明Trap Gate
: 用于处理异常(如除法错误、非法指令等)。System Gate
: 用于处理软件中断(如 INT 3 指令)。
-
具体设置
-
设置
Trap Gates
0
:Divide Error
(÷_error): 处理除法错误。1
:Debug (&debug)
: 调试异常处理。2: NMI (&nmi)
: 非屏蔽中断处理。6: Invalid Opcode (&invalid_op)
: 非法操作码处理。7: Device Not Available (&device_not_available)
: 设备不可用处理。8: Double Fault (&double_fault)
: 双重故障处理。9: Coprocessor Segment Overrun (&coprocessor_segment_overrun)
: 协处理器段越界处理。10: Invalid TSS (&invalid_TSS)
: 无效任务状态段处理。11: Segment Not Present (&segment_not_present)
: 段不存在处理。12: Stack Segment (&stack_segment)
: 栈段错误处理。13: General Protection (&general_protection)
: 一般保护错误处理。14: Page Fault (&page_fault)
: 页面错误处理。15: Reserved (&reserved)
: 预留处理。16: Coprocessor Error (&coprocessor_error)
: 协处理器错误处理。- 17-47: Reserved (&reserved): 这些中断号被预留未使用。
- 45: IRQ13 (&irq13): IRQ13 中断处理。
-
设置
System Gates
3: INT 3 (&int3)
: 处理 INT 3 指令触发的中断。4: Overflow (&overflow):
处理溢出异常。5: Bounds (&bounds)
: 处理越界异常。
-
并口中断设置
39: Parallel Interrupt (¶llel_interrupt)
: 并口中断处理。
关闭 PIC 中断
-
使用
outb_p
和inb_p
函数控制可编程中断控制器 (PIC
) 的寄存器以禁用某些中断。0x21
: 禁用IRQ2
(从8259B)。0xA1:
禁用IRQ2
(主8259A)。
-
-
总结
该函数通过设置Trap Gates
和System Gates
来初始化中断和异常处理程序。
它确保了操作系统能够响应各种硬件和软件异常,并且能够处理特定的中断请求。
此外,还通过控制PIC
寄存器来管理部分中断的启用或禁用。
源码
/*
* linux/kernel/traps.c
*
* (C) 1991 Linus Torvalds
*/
/*
* 'Traps.c' handles hardware traps and faults after we have saved some
* state in 'asm.s'. Currently mostly a debugging-aid, will be extended
* to mainly kill the offending process (probably by giving it a signal,
* but possibly by killing it outright if necessary).
*/
#include <string.h>
#include <linux/head.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <asm/system.h>
#include <asm/segment.h>
#include <asm/io.h>
#define get_seg_byte(seg,addr) ({
\
register char __res; \
__asm__("push %%fs;mov %%ax,%%fs;movb %%fs:%2,%%al;pop %%fs" \
:"=a" (__res):"0" (seg),"m" (*(addr))); \
__res;})
#define get_seg_long(seg,addr) ({
\
register unsigned long __res; \
__asm__("push %%fs;mov %%ax,%%fs;movl %%fs:%2,%%eax;pop %%fs" \
:"=a" (__res):"0" (seg