소프트웨어 인터럽트
프로그램이 특정 명령어를 실행하여 의도적으로 발생시키는 동기적 인터럽트로, 주로 시스템 콜을 통해 커널 기능을 요청할 때 사용됩니다.
| 항목 | 하드웨어 인터럽트 | 소프트웨어 인터럽트 |
| 발생 주체 | 외부 하드웨어 장치 | 프로그램 내부 명령어 |
| 동기/비동기 | 비동기적 | 동기적 (명령어 실행 시점에 발생) |
| 의도성 | 비의도적 (외부 이벤트) | 의도적 (프로그래머가 명시) |
| 전달 경로 | 장치 → 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 기반 → 빠름 |
sysenter | Windows/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 ────── 이중 폴트, 하드웨어 오류