struct intr_frame {
/* intr-stubs.S의 intr_entry에 의해 푸시됨.
중단된 작업의 저장된 레지스터입니다. */
struct gp_registers R; // 정수 레지스터 구간
uint16_t es; // Extra Segment - Extra Data 영역
uint16_t __pad1;
uint32_t __pad2;
uint16_t ds; // Data Segment - 데이터 영역
uint16_t __pad3;
uint32_t __pad4;
/* intr-stubs.S의 intrNN_stub에 의해 푸시됨. */
uint64_t vec_no; /* Interrupt vector number. */
/* 때로는 CPU에 의해 푸시되고, 그렇지 않으면 일관성을 위해 intrNN_stub에 의해 0으로 푸시됩니다.
CPU는 이를 'EIP' (Extended) Instruction Pointer 바로 아래에 두지만 우리는 여기로 옮깁니다. */
uint64_t error_code;
/* CPU에 의해 푸시됨.
중단된 작업의 저장된 레지스터입니다.. */
uintptr_t rip; // Instruction Pointer = Program Counter 다음에 실행될 명령의 주소
uint16_t cs; // Code Segment - 명령어 영역
uint16_t __pad5;
uint32_t __pad6;
uint64_t eflags; // Extended Flags - 상태, 제어, 시스템 플래그 -> 레지스터가 어떤 일을 수행하는 지
uintptr_t rsp; // Stack Pointer - 스택 포인터
uint16_t ss; // Stack Segment - 임시 Stack 영역
uint16_t __pad7;
uint32_t __pad8;
} __attribute__((packed));
struct intr_frame 구조체 해석이 구조체는 인터럽트가 발생하거나 트랩(예: 시스템 호출)이 처리되는 동안 중단된 작업의 상태를 저장하는 데 사용됩니다. 인터럽트 처리기가 실행되면 CPU 상태(레지스터, 스택 포인터 등)를 저장하고 인터럽트 처리가 끝나면 복원합니다.
struct gp_registers Rintr-stubs.S의 intr_entry에 의해 푸시됩니다.es, ds)es (Extra Segment): 추가 데이터 세그먼트ds (Data Segment): 데이터 세그먼트__pad1 ~ __pad4: 메모리 정렬을 위해 추가된 패딩입니다.vec_no (Interrupt Vector Number)0x0D: 일반적인 보호 오류0x80: 시스템 호출error_coderip (Instruction Pointer)cs (Code Segment)eflags (Extended Flags)rsp (Stack Pointer)ss (Stack Segment)struct intr_frame에 이 정보를 복사해 둡니다.rip 레지스터와 eflags 플래그를 확인해 인터럽트가 발생한 위치와 상태를 분석합니다.__pad1 ~ __pad8는 메모리 정렬을 보장하기 위한 패딩입니다. 메모리 정렬은 성능 최적화 및 하드웨어 호환성을 위해 필수적입니다.
struct intr_frame은 인터럽트와 트랩 처리 중 작업 상태를 저장하고 복원하는 데 사용됩니다. 이를 통해 커널은 사용자 모드에서 실행 중이던 작업을 중단하고 인터럽트를 처리한 후, 다시 원래 작업을 계속할 수 있습니다.