PE Notes · CA/OS
세그먼테이션 오류
허가되지 않은 주소나 잘못된 권한 접근이 세그먼테이션 오류가 되는 길을 가르고, 다섯 원인과 MMU·시그널 처리, 탐지 도구를 정리합니다.
프로세스는 자기 주소 공간만 만질 수 있습니다. 그 바깥이거나, 읽기만 되는 칸에 쓰면 하드웨어가 먼저 알아챕니다. 는 그 순간 운영체제가 프로세스를 멈추는 이름입니다. 유닉스 계열은 를 보냅니다. 옆 노트의 누수가 천천히 메모리를 깎는 것과 달리, 세그폴트는 대개 그 자리에서 종료입니다.
다섯 구멍
가장 흔한 구멍은 빈 주소를 역참조하는 일입니다. 배열 끝을 넘는 쓰기는 입니다. 해제한 뒤 다시 쓰면 Use After Free입니다. 재귀가 스택을 밀어 올리면 스택 오버플로우입니다. 코드·상수 칸에 쓰는 것도 같은 신호로 끝납니다.
| 원인 | 한 줄 |
|---|---|
| 역참조 | 0번 근처를 읽거나 씀 |
| 버퍼 초과 | 할당 길이를 넘는 첨자 |
| 해제 후 사용 | free 뒤 같은 포인터 |
| 스택 초과 | 끝나지 않는 재귀 |
| 읽기 전용 쓰기 | 텍스트·리터럴 수정 |
| 영역 | 읽기 | 쓰기 | 실행 |
|---|---|---|---|
| 코드 | 허용 | 금지 | 허용 |
| 데이터·힙·스택 | 허용 | 허용 | 보통 금지 |
| NULL 근처 | 금지 | 금지 | 금지 |
권한 표는 가상 메모리와 배치 노트가 받칩니다. 실행 비트를 끈 힙에 코드를 올리려 해도 같은 예외가 납니다.
커널이 받는 길
가 변환·권한을 검사하다 실패하면 예외가 올라갑니다. 커널은 그 접근이 합법 페이지 폴트인지, 불법인지를 가릅니다. 불법이면 시그널을 주고 기본 동작은 종료입니다. 디버깅을 켜 두면 가 그 순간의 메모리를 남깁니다. 버스 오류는 정렬이 틀린 접근이고, 댕글링 포인터는 세그폴트를 부르는 원인 쪽입니다.
현장은 디버거로 덤프를 열고, 런타임 검사기로 잘못된 읽기를 쫓으며, 컴파일 시 주소 살균과 정적 분석으로 구멍을 미리 줍습니다. 답안은 정의, 다섯 원인, 영역 권한, MMU→시그널 흐름을 한 장에 닫습니다.