소프트웨어 인터럽트

프로그램이 특정 명령어를 실행하여 의도적으로 발생시키는 동기적 인터럽트로, 주로 시스템 콜을 통해 커널 기능을 요청할 때 사용됩니다.

하드웨어 인터럽트 vs 소프트웨어 인터럽트

항목하드웨어 인터럽트소프트웨어 인터럽트
발생 주체외부 하드웨어 장치프로그램 내부 명령어
동기/비동기비동기적동기적 (명령어 실행 시점에 발생)
의도성비의도적 (외부 이벤트)의도적 (프로그래머가 명시)
전달 경로장치 → PIC/APIC → CPU명령어 → CPU 직접 처리
예시키보드 입력, 타이머시스템 콜, 디버그 브레이크포인트

소프트웨어 인터럽트의 종류

종류설명예시
트랩(Trap)의도적으로 커널 기능 요청시스템 콜, 디버그 브레이크포인트
예외(Exception)프로그램 실행 중 오류로 발생0으로 나누기, 페이지 폴트, 세그폴트
소프트웨어 인터럽트
    │
    ├── 트랩 (Trap) ─── 의도적 발생
    │    ├── 시스템 콜 (read, write, fork ...)
    │    └── 디버그 브레이크포인트 (int 3)
    │
    └── 예외 (Exception) ─── 비의도적 발생
         ├── Fault  ─── 복구 가능 (페이지 폴트)
         ├── Trap   ─── 다음 명령어로 복귀 (오버플로우)
         └── Abort  ─── 복구 불가 (하드웨어 오류)

동작 흐름

┌─────────────── 사용자 모드 ────────────────┐
│                                           │
│  프로그램 실행 중                            │
│      │                                    │
│      ▼  int 0x80 / syscall 명령어 실행      │
├──────────── 소프트웨어 인터럽트 발생 ──────────┤
│                                           │
│  ① CPU가 현재 상태 저장 (PC, 레지스터)       │
│  ② IDT에서 벡터 번호로 핸들러 조회           │
│  ③ 커널 모드 전환 (모드 비트 1 → 0)         │
│  ④ 핸들러(ISR) 실행                        │
│  ⑤ 결과 저장 후 iret으로 복귀               │
│                                           │
├──────────── 사용자 모드 복귀 ────────────────┤
│      ▼                                    │
│  프로그램이 결과를 받고 계속 실행              │
└───────────────────────────────────────────┘

x86에서의 소프트웨어 인터럽트 명령어

명령어용도특징
int 0x80리눅스 시스템 콜 (32비트)IDT 조회 → 느림
syscall리눅스 시스템 콜 (64비트)MSR 기반 → 빠름
sysenterWindows/Intel 시스템 콜syscall과 유사
int 3디버그 브레이크포인트1바이트 (0xCC)
int n범용 소프트웨어 인터럽트벡터 번호 n 지정

예외(Exception)의 세부 분류

분류설명복귀 지점예시
Fault복구 가능한 오류, 원인 해결 후 재실행오류 발생 명령어페이지 폴트 (디스크에서 페이지 로드 후 재실행)
Trap정상적으로 다음 명령어로 진행다음 명령어오버플로우 감지, 디버그 브레이크포인트
Abort복구 불가능한 심각한 오류복귀 불가하드웨어 오류, 이중 폴트(Double Fault)

페이지 폴트 처리 예시 (Fault)

① 프로그램이 메모리 주소 접근
② 해당 페이지가 물리 메모리에 없음
③ Page Fault 예외 발생 (소프트웨어 인터럽트)
④ 커널 모드 전환
⑤ 커널이 디스크에서 해당 페이지를 메모리에 로드
⑥ 페이지 테이블 갱신
⑦ 사용자 모드 복귀 → 원래 명령어 재실행 (Fault이므로)

Java에서의 소프트웨어 인터럽트 발생 상황

// ── 트랩 (시스템 콜) ──
// JVM 내부에서 syscall 명령어 → 소프트웨어 인터럽트 발생
System.out.println("hello");         // write() 시스템 콜
new FileInputStream("data.txt");     // open() 시스템 콜
Runtime.getRuntime().exec("ls");     // fork() + execve() 시스템 콜

// ── 예외 (Exception) ──
// CPU가 실행 중 오류를 감지 → 소프트웨어 인터럽트 발생
int a = 10 / 0;                      // Divide Error (벡터 0) → ArithmeticException
int[] arr = new int[3];
arr[10] = 5;                         // 잘못된 메모리 접근 → 세그폴트 가능

// ── 페이지 폴트 ──
// JVM이 큰 배열 할당 시 실제 물리 메모리는 접근 시점에 매핑됨
byte[] huge = new byte[1024 * 1024 * 100]; // 100MB
huge[0] = 1;      // 첫 접근 시 Page Fault → 커널이 물리 페이지 할당
huge[50000000] = 1; // 다른 페이지 접근 시 또 Page Fault 발생 가능

전체 인터럽트 체계 요약

인터럽트 (Interrupt)
    │
    ├── 하드웨어 인터럽트 (비동기, 외부 장치)
    │    ├── 마스커블 (Maskable) ── 키보드, 디스크, NIC
    │    └── 논마스커블 (NMI) ──── 전원 이상, 메모리 오류
    │
    └── 소프트웨어 인터럽트 (동기, 프로그램 내부)
         ├── 트랩 (Trap) ──────── 시스템 콜, 디버그
         └── 예외 (Exception)
              ├── Fault ────── 페이지 폴트
              ├── Trap ─────── 오버플로우
              └── Abort ────── 이중 폴트, 하드웨어 오류

CSLOG에서 보기