Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
trap_init()

5.4. trap_init()

트랩은 인터럽트와는 달리 정해진 곳으로 분기하도록 되어 있고 번호로 정해져 있다. 아래는 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)