일반 보호 결함
General protection fault![]() | 이 글에는 여러 가지 문제가 있다.이 문제를 개선하거나 대화 페이지에서 토의하십시오.(이러한 템플릿 메시지를 제거하는 방법 및 시기 알아보기)
|
x86 명령 집합 아키텍처(ISA)의 일반 보호 장애(GPF)는 커널이나 사용자 프로그램에서 일부 실행 코드로 인한 액세스 위반에 대응하여 ISA 정의 보호 메커니즘에 의해 시작된 장애(단순의 일종)이다.이 메커니즘은 1983년에 도입된 인텔 80286 CPU에 대한 인텔 매뉴얼과 데이터시트에 처음 설명되어 있으며, 1986년부터 Intel 80386 프로그래머 참조 매뉴얼의 섹션 9.8.13에도 설명되어 있다.일반 보호 장애는 인터럽트(벡터 번호 13(0Dh))로 구현된다.일부 운영체제는 불법 opcode 예외와 같이 접근 위반과 관련되지 않은 일부 예외를 메모리 보호와 무관하더라도 일반 보호 장애로 분류할 수도 있다.CPU가 보호 위반을 감지하면 코드 실행을 중지하고 GPF 인터럽트를 전송한다.대부분의 경우 운영 체제는 실행 대기열에서 실패하는 프로세스를 제거하고 사용자에게 신호를 보내며 다른 프로세스를 계속 실행한다.그러나 운영 체제가 일반적인 보호 고장을 잡지 못할 경우, 즉 운영 체제가 이전 GPF 인터럽트에서 복귀하기 전에 또 다른 보호 위반이 발생하는 경우 CPU는 이중 장애 신호를 보내 운영 체제를 정지시킨다.아직 또 다른 고장(트리플 결함)이 발생하면 CPU는 복구할 수 없다. 80286년부터 CPU는 하드웨어 재설정을 통해서만 종료될 수 있는 "셧다운"이라는 특수한 정지 상태에 들어간다.80286을 탑재한 최초의 PC 호환 시스템인 IBM PC AT는 Shutdown 상태를 감지하고 발생 시 CPU를 자동으로 리셋하는 하드웨어를 갖추고 있다.PC AT의 모든 후손이 같은 일을 하므로 PC에서는 3중 결함으로 즉시 시스템 재설정이 발생한다.
구체적인 행동
Microsoft Windows에서 일반 보호 장애는 제품 버전에 따라 다양한 언어로 표시됨:
운영 체제 | 오류 메시지 | 메모들 |
---|---|---|
윈도 3.0 | 복구할 수 없는 응용 프로그램 오류 현재 응용 프로그램을 종료하는 중. | [1] |
윈도 3.1x | [프로그램 이름]이(가) [메모리 주소]의 [모듈 이름] 모듈에 일반 보호 장애를 일으켰다. | 이 오류 메시지(동일한 설계 형식)는 드물게 이후 버전(95와 98)에서도 나타날 수 있다. |
윈도 95 윈도 98 윈도 NT 4.0 | 이 프로그램은 불법 운영을 해왔기 때문에 폐쇄될 것이다. | |
윈도 2000 | [Program Name](프로그램 이름)에서 오류가 발생했으며 Windows(윈도우)에서 닫을 것이다. | |
윈도 미 | [Program Name]에서 [Module Name]에 오류가 발생함[프로그램 이름]이(가) 이제 닫힌다. | |
윈도 XP 윈도 서버 2003 Windows Server 2003 R2 | [프로그램 이름]에 문제가 발생하여 닫아야 한다.우리는 불편하게 해서 미안하다. 만약 당신이 무언가를 하고 있다면, 당신이 작업하고 있던 정보가 없어질 수도 있다. [...] 이 오류에 대한 자세한 내용을 보려면 여기를 클릭하십시오. | 오류 메시지는 또한 분석을 위해 오류 세부 정보를 Microsoft에 보낼 수 있는 옵션을 제공한다. |
Windows Vista 이상(Windows 10 제외) Windows Server 2008 이상 | [프로그램 이름]이(가) 작동을 중지했다. 문제가 발생하여 프로그램이 제대로 작동하지 않았다.Windows(윈도우)에서 프로그램을 닫고 사용 가능한 해결 방법이 있으면 알려준다. | 기본적으로 Windows(윈도우)는 분석을 위해 Microsoft에 오류 세부 정보를 보내지만, 매번 전송하지 않거나 사용자에게 수행할 작업을 묻지 않도록 시스템을 구성할 수 있다. |
윈도 10 | 윈도우는 분석을 위해 마이크로소프트에 오류 세부 정보를 보낼 것이다.사업자등록증이 있는 사용자는 전송되는 정보의 양을 구성할 수 있다. |
윈도우 11은 더 이상 이것을 하지 않는다.일반 보호 결함이 발생할 경우 프로그램을 무작위로 닫는다.
유닉스 및 리눅스에서는 오류가 별도로 보고된다(예: 메모리 오류에 대한 분할 결함).
메모리 오류
메모리 오류에서 오류 프로그램은 액세스하면 안 되는 메모리에 액세스한다.예를 들면 다음과 같다.
- 메모리의 읽기 전용 부분에 쓰기 시도 중
- 지침으로 지정되지 않은 메모리에서 바이트 실행을 시도하는 중
- 지침으로 지정된 메모리에서 데이터 바이트로 읽기를 시도하는 중
- 그 밖에 기억의 일부 지정과 그 사용 사이의 잡다한 충돌
그러나 현대의 많은 운영 체제는 분할 대신 페이징을 통해 메모리 액세스 제어 체계를 구현하기 때문에 Windows와 같은 운영체제의 유효하지 않은 메모리 참조가 일반적인 보호 결함 대신 페이지 결함을 통해 보고되는 경우가 많다.운영체제는 여러 가지 다른 유형의 프로세서 생성 오류 조건을 처리하기 위한 표준 인터페이스를 제공하기 위해 프로그램으로부터 메모리 액세스 오류를 발생시키기 위해 사용된 내부 프로세서 메커니즘을 숨기는 추상화 계층(예: 예외 처리 또는 신호)을 제공한다.
x86 아키텍처 측면에서 일반 보호 장애는 메모리 액세스에 관한 한 분할 기반 보호에 한정된다.그러나 일반 보호 장애는 현재 권한 수준(CPL)에서 액세스할 수 없는 명령의 사용과 같이 페이징을 사용할 때 다른 보호 위반(메모리 액세스 위반과 관계 없이)을 보고하는 데 여전히 사용된다.
운영체제가 페이징과 분할을 모두 활용하는 것은 이론적으로 가능하지만, 대부분의 경우 공통 운영체제는 대개 그들의 메모리 액세스 제어 필요의 대부분을 페이징에 의존한다.
권한 오류
컴퓨터에는 운영체제 전용으로 예약된 것들이 있다.운영체제의 일부가 아닌 프로그램이 이러한 기능들 중 하나를 사용하려고 하는 경우, 일반적인 보호 장애를 일으킬 수 있다.
또한 운영 체제와 프로세서 자체를 위해 예약된 저장 위치도 있다.예약의 결과로, 그들은 읽기 전용이며, 특권이 없는 프로그램에 의해 그들에게 데이터를 쓰려는 시도는 오류다.
고장의 기술적 원인
일반 보호 장애는 사용자 모드 프로그램이 보호 명령을 시도 중이거나 운영 체제가 프로세서를 정의되지 않은 상태로 만드는 요청을 발행했기 때문에 현재 실행 중인 작업의 권한 수준을 초과하는 보호 명령이 발생할 때 프로세서에 의해 제기된다.
일반적인 보호 결함이 현대적 운영 체제에 의해 포착되어 처리된다.일반적으로 사용자 모드 프로그램에서 결함이 발생한 경우 사용자 모드 프로그램은 종료된다.그러나, 코어 시스템 드라이버나 운영 체제 자체에서 발생한 고장일 경우, 운영 체제는 대개 진단 정보를 파일이나 화면에 저장하고 작동을 중지한다.컴퓨터를 다시 시작하거나 블루 스크린 오브 데스(Blue Screen of Death) 또는 커널 패닉과 같은 오류 화면을 표시한다.
세그먼트 제한 초과
세그먼트 제한 초과 가능:
- 코드 세그먼트(CS), 데이터 세그먼트(DS) 또는 ES, FS 또는 GS(추가 세그먼트) 레지스터 포함
- Global Descriptor Table(GDT), Interrupt Descriptor Table(IDT), Local Descriptor Table(LDT)과 같은 설명자 테이블에 액세스한다.
세그먼트 권한 위반
세그먼트 권한은 다음에 의해 위반될 수 있다.
- 비이동 세그먼트로 점프
- 코드 세그먼트에 쓰기 또는 읽기 전용 세그먼트
- 실행 전용 세그먼트 읽기
불법 로드된 세그먼트
이는 다음과 같은 경우에 발생할 수 있다.
- 스택 세그먼트(SS)에 CS의 현재 권한과 일치하지 않는 설명자 권한이 있는 세그먼트, 실행 파일, null 세그먼트 또는 설명자 권한에 대한 세그먼트 선택기가 로드됨
- 데이터, 시스템 또는 null 세그먼트에 대한 세그먼트 선택기가 로드된 코드 세그먼트(CS)
- SS, DS, ES, FS 또는 GS는 시스템 세그먼트에 대한 세그먼트 선택기가 로드된 세그먼트임
- SS, DS, ES, FS 또는 GS는 실행 전용 코드 세그먼트에 대해 세그먼트 선택기가 로드된 세그먼트임
- Null Selector가 포함된 경우 DS, ES, FS 또는 GS 레지스터를 사용하여 메모리 액세스
전환
다음과 같은 경우 TSS(태스크 상태 세그먼트) 구조에서 결함이 발생할 수 있다.
- 통화 또는 점프 명령 중에 사용 중인 작업으로 전환
- 인터럽트 리턴(IRET) 명령 중에 사용 가능한 작업으로 전환
- LDT에서[clarification needed] TSS 설명자를 가리키는 스위치의 세그먼트 선택기 사용
잡다한
일반 보호 결함의 기타 원인은 다음과 같다.
- 처리기의 DDL(코드 세그먼트 설명자 권한 수준)이 0보다 클 때 가상 8086 모드에서 인터럽트/예외 핸들러 액세스 시도
- CR4의 예약된 비트에 하나를 쓰려고 시도
- 현재 권한 수준(CPL)이 0이 아닐 때 권한 있는 명령 실행 시도
- MSR 지침에서 예약된 비트에 쓰기
- Null 세그먼트 선택기가 포함된 게이트 액세스
- CPL이 인터럽트 게이트에 대해 설정된 DPL보다 클 때 소프트웨어 인터럽트 실행
- 호출, 인터럽트 또는 트랩 게이트의 세그먼트 선택기가 코드 세그먼트를 가리키지 않음
- 특권규정 위반
- 페이징을 활성화하는 동시에 보호 기능 비활성화
- 인터럽트, 트랩 또는 작업 게이트가 아닌 인터럽트 또는 예외 다음에 나타나는 인터럽트 설명자 테이블 참조
- 레거시 SSE: 메모리 피연산자가 16바이트 정렬되지 않음.
참조
- ^ "Troubleshooting "Unrecoverable Application Error" in DrWatson". Support. Microsoft. 27 February 2014.
추가 읽기
- Intel Architecture Software Developer's Manual-Volume 3: 시스템 프로그래밍