트랩은 인터럽트와는 달리 정해진 곳으로 분기하도록 되어 있고 번호로 정해져 있다. 아래는 i386에서 정해져 있는 트랩의 일부를 열거한 것이다.
0 - divide_error
1 - debug
2 - nmi
3 - int3
4 - overflow
5 - bounds
6 - invalid_op
7 - device_not_available
8 - double_fault
9 - coprocessor_segment_overrun
10 - invalid_TSS
11 - segment_not_present
12 - stack_segment
13 - general_protection
14 - page_fault
15 - spurious_interrupt_bug
16 - coprocessor_error
17 - alignment_check
18 - machine_check
19 - simd_coprocessor_error
trap_init()에선 시스템 콜을 위한 초기화도 실행해 0x80을 시스템 콜에 사용하도록 해놓는다.
그리고 CPU를 초기화 한다. CPU 초기화에선 페이지, gdt, ldt, idt, tss 등이 설정되고 이를 사용할 수 있는 상태로 만들어 본격적인 커널 실행에 들어간다. /var/log/dmesg의 (6)에 출력된 한 줄이 CPU의 초기화를 의미한다.
i386에서 trap을 초기화하는 함수인 _set_gate()는 C.2.2절를 참조 하기 바란다.
ARM 프로세서의 trap은 arch/arm/kernel/entry-armv.S나 arch/arm/kernel/entry-armo.S에 정의되어 있고 내용은 다음과 같다. 앞의 값은 vector의 offset을 말한다.
0x00000000 - reset
0x00000004 - Undefined instruction
0x00000008 - Software Interrupt(SWI)
0x0000000C - Prefetch Abort(Instruction fetch memory abort)
0x00000010 - Data Abort(Data Access memory abort)
0x00000018 - IRQ(Interrupt)
0x0000001C - FIQ(Fast Interrupt)