맨위로가기

X86 디버그 레지스터

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

X86 디버그 레지스터는 x86 아키텍처에서 디버깅을 위해 사용되는 특수 레지스터 집합을 의미한다. 여기에는 DR0-DR3 (디버그 주소 레지스터), DR4, DR5 (예약 레지스터), DR6 (디버그 상태 레지스터), DR7 (디버그 제어 레지스터)이 포함된다. DR0-DR3는 중단점 조건을 위한 선형 주소를 저장하며, DR6는 디버그 상태를 나타내고, DR7은 중단점의 유형과 크기를 제어한다. CR4.DE 비트에 따라 DR4/5의 동작이 달라지며, CR4.DE=0일 경우 DR6/7로 별칭 지정되고, CR4.DE=1일 경우 접근 시 오류가 발생한다.

더 읽어볼만한 페이지

  • 디지털 레지스터 - 명령 레지스터
  • 디지털 레지스터 - 시프트 레지스터
    시프트 레지스터는 클럭 신호에 따라 데이터를 순차적으로 이동시키는 디지털 회로로, 입출력 방식에 따라 다양한 종류가 있으며, 데이터 변환, 지연 회로, 펄스 폭 확장, 스택 구현, I/O 핀 확장 등 다양한 용도로 활용된다.
  • X86 명령어 - 스트리밍 SIMD 확장
    스트리밍 SIMD 확장(SSE)은 x86 아키텍처의 SIMD 명령어 집합으로, 128비트 XMM 레지스터를 사용하여 데이터 병렬 처리를 통해 성능을 향상시키며, 인텔 펜티엄 III 프로세서에 처음 도입되어 여러 후속 버전으로 발전했다.
  • X86 명령어 - SSE2
    SSE2는 인텔이 개발한 x86 아키텍처의 SIMD 명령어 집합 확장으로, MMX 명령어의 정수 벡터 연산을 확장하고 XMM 레지스터를 사용하여 부동 소수점 연산 성능을 향상시키며, AMD64 아키텍처에서도 지원된다.
  • 디버깅 - 스택 추적
    스택 추적은 프로그램 실행 중 함수 호출 기록을 추적하여 오류 발생 시 디버깅 및 문제 해결에 필수적인 도구로, 호출 스택의 스택 프레임을 분석하여 프로그램 실행 경로를 파악하고 오류 원인을 추적하며 프로그램 안정성을 향상시키는 기술이다.
  • 디버깅 - 메모리 디버거
    메모리 디버거는 메모리 접근, 할당, 해제를 모니터링하여 메모리 오류를 찾아내고 소프트웨어의 신뢰성을 높이는 도구이다.
X86 디버그 레지스터
개요
종류레지스터
용도디버깅
아키텍처x86
레지스터 목록
DR0선형 주소 브레이크포인트 0
DR1선형 주소 브레이크포인트 1
DR2선형 주소 브레이크포인트 2
DR3선형 주소 브레이크포인트 3
DR4사용되지 않음
DR5사용되지 않음
DR6디버그 상태
DR7디버그 제어
세부 정보
DR0-DR3DR0에서 DR3까지의 레지스터는 4개의 하드웨어 브레이크포인트를 저장하는 데 사용된다.
각 레지스터는 프로그램 실행 중에 감시할 메모리 주소를 보유한다.
CPU가 이러한 주소에 접근하면 (읽기, 쓰기 또는 실행), 디버거에 신호가 전송된다.
DR6DR6 레지스터는 디버그 이벤트의 상태를 나타낸다.
어떤 브레이크포인트가 트리거되었는지, 단일 스텝핑이 발생했는지, 또는 다른 디버그 이벤트가 발생했는지에 대한 정보를 포함한다.
DR7DR7 레지스터는 디버그 레지스터의 제어 및 구성을 담당한다.
브레이크포인트의 활성화, 브레이크포인트 조건 (읽기/쓰기/실행), 및 브레이크포인트의 로컬 또는 글로벌 상태를 설정하는 데 사용된다.
또한 DR7은 정확한 브랜치 추적을 위한 플래그를 포함한다 (인텔 프로세서에서만 사용 가능).
활용 예시
코드 디버깅특정 메모리 위치에 접근하는 시점을 감지하여 버그를 찾는다.
악성코드 분석악성코드가 특정 API를 호출하거나 특정 메모리 영역에 접근하는 것을 감지한다.
리버스 엔지니어링프로그램의 실행 흐름을 추적하고 분석한다.

2. 디버그 레지스터의 종류와 기능

x86 아키텍처에서 사용되는 디버그 레지스터는 프로그램 실행을 제어하고 디버깅하는 데 사용되는 특별한 레지스터이다. 디버그 레지스터의 종류와 기능은 다음과 같다.
DR0-DR3 (디버그 주소 레지스터)DR0, DR1, DR2, DR3 레지스터는 각각 4개의 중단점(Breakpoint) 조건을 설정하는 데 사용되는 선형 주소를 저장한다. 페이징 활성화 여부에 관계없이 유효하며, 페이징이 활성화된 경우에는 페이징 메커니즘을 통해 선형 주소가 물리 주소로 변환된다. 각 중단점 조건은 DR7 레지스터의 비트에 의해 더 상세하게 정의된다.[1]
DR4 및 DR5 (예약 레지스터)DR4와 DR5는 실제 레지스터가 아니며, CR4.DE 비트를 지원하는 프로세서(인텔 펜티엄 및 이후)에서 해당 동작은 CR4.DE에 의해 제어된다. CR4.DE=0이면 DR4와 DR5는 각각 DR6과 DR7로 별칭이 지정되고, CR4.DE=1이면 DR4/5에 접근하면 #UD (잘못된 opcode) 예외가 발생한다.[10]
DR6 (디버그 상태 레지스터)DR6는 디버그 상태를 나타내는 레지스터로, 어떤 디버그 조건이 발생했는지 확인하는 데 사용된다. 프로세서는 활성화된 디버그 예외를 감지하면 디버그 예외 처리기에 진입하기 전에 이 레지스터의 해당 비트를 설정한다. DR6의 비트들은 프로세서에 의해 초기화되지 않으므로, 디버거 핸들러는 반환하기 전에 DR6를 0으로 채워야 한다.[4]

비트약어설명
0B0Breakpoint #0 조건 감지[4][1]
1B1Breakpoint #1 조건 감지[4][1]
2B2Breakpoint #2 조건 감지[4][1]
3B3Breakpoint #3 조건 감지[4][1]
10:4예약됨. 386/486 프로세서에서는 모두 0, 이후 프로세서에서는 모두 1로 읽음.[2]
11BLD버스 잠금 트랩 예외에 대해 프로세서에 의해 0으로 지워짐.[3]
12BK,
SMMS
(386/486만 해당) SMM 또는 ICE 모드 진입[2] (DR7, 비트 12 참조).
13BD디버그 레지스터 액세스 감지[4] (DR7, 비트 13 참조).
14BS단일 단계 실행 (EFLAGS.TF에 의해 활성화됨)
15BT작업 전환 중단점. T 비트가 설정된 TSS로 작업 전환 시 발생.
16RTM(인텔 TSX가 있는 프로세서만 해당) RTM 트랜잭션 내부 디버그 예외 시 0으로 지워짐.
31:17예약됨.
63:32(x86-64만 해당) 예약됨.


DR7 (디버그 제어 레지스터)DR7은 디버그 제어 레지스터로, 4개의 중단점을 설정하고 제어한다. 각 중단점은 DR0~DR3 레지스터에 저장된 선형 주소와 연결되며, DR7 레지스터의 비트를 통해 활성화 여부, 조건, 길이 등을 설정할 수 있다.

DR7의 하위 8비트(0~7)는 4개의 주소 중단점을 선택적으로 활성화한다. 각 중단점은 로컬(0, 2, 4, 6번 비트) 또는 전역(1, 3, 5, 7번 비트)으로 활성화 가능하다. 16~31번 비트는 중단점 발생 조건(R/W)과 길이(LEN)를 설정한다.


  • R/W (Read/Write) 비트 (16-17, 20-21, 24-25, 28-29번 비트): 중단점 발생 조건을 설정한다.


중단 시점
00명령어 실행만
01데이터 쓰기만
10I/O 읽기 및 쓰기 (CR4.DE = 1인 경우)
11데이터 읽기 및 쓰기 (쓰기 전용 아님)


  • LEN (Length) 비트 (18-19, 22-23, 26-27, 30-31번 비트): 중단점의 길이를 설정한다.


중단점 길이
001바이트
012바이트
108바이트 (64비트 모드)
114바이트

[11]

DR7 레지스터의 비트 구성은 다음과 같다.

비트약어설명
0L0중단점 #0 로컬 활성화
1G0중단점 #0 전역 활성화
2L1중단점 #1 로컬 활성화
3G1중단점 #1 전역 활성화
4L2중단점 #2 로컬 활성화
5G2중단점 #2 전역 활성화
6L3중단점 #3 로컬 활성화
7G3중단점 #3 전역 활성화
8LE(386 전용) 로컬 정확 중단점 활성화
9GE(386 전용) 전역 정확 중단점 활성화
10예약됨
11RTM(인텔 TSX 프로세서만) RTM 트랜잭션 고급 디버깅 활성화
12IR, SMIE(386/486 프로세서만) 중단점 일치 시 동작 설정.
13GD일반 감지 활성화.
15:14예약됨
17:16R/W0중단점 #0 조건
19:18LEN0중단점 #0 길이
21:20R/W1중단점 #1 조건
23:22LEN1중단점 #1 길이
25:24R/W2중단점 #2 조건
27:26LEN2중단점 #2 길이
29:28R/W3중단점 #3 조건
31:30LEN3중단점 #3 길이
32DR0_PT_LOGPTTT 트리거 입력으로 DR0/1/2/3 중단점 일치 활성화.[9]
33DR1_PT_LOG
34DR2_PT_LOG
35DR3_PT_LOG
63:36(x86-64 전용) 예약됨.


2. 1. DR0-DR3 (디버그 주소 레지스터)

이 각각의 프로세서 레지스터는 4개의 중단점 조건 중 하나와 관련된 선형 주소를 포함하고 있다. 각 중단점 조건은 DR7의 비트에 의해 더 상세히 정의된다.[1]

디버그 주소 레지스터는 페이징이 활성화되었는지 여부에 관계없이 유효하다. 이들 레지스터의 주소는 선형 주소이다. 페이징이 활성화된 경우 선형 주소는 프로세서의 페이징 메커니즘에 의해 물리 주소로 변환된다. 페이징이 활성화되지 않은 경우, 이 선형 주소는 물리 주소와 동일하다.[1]

페이징이 활성화된 경우 서로 다른 태스크가 서로 다른 선형-물리 주소 매핑을 가질 수 있다는 점에 유의해야 한다. 이러한 경우, 디버그 주소 레지스터의 주소는 한 태스크에는 관련이 있을 수 있지만 다른 태스크에는 관련이 없을 수 있다. 이러한 이유로 x86은 DR7에 전역 및 로컬 활성화 비트를 모두 가지고 있다. 이러한 비트는 주어진 디버그 주소가 전역(모든 태스크) 관련성 또는 로컬(현재 태스크만) 관련성을 갖는지 여부를 나타낸다.[1]

2. 2. DR4 및 DR5 (예약 레지스터)

DR4 및 DR5는 실제 레지스터가 아니다. CR4.DE 비트를 지원하는 프로세서(인텔 펜티엄 및 이후)에서 해당 동작은 CR4.DE에 의해 제어된다.

  • CR4.DE=0: DR4와 DR5는 각각 DR6과 DR7로 별칭이 지정된다.
  • CR4.DE=1: DR4/5에 접근하면 #UD (잘못된 opcode) 예외가 발생한다.


CR4.DE가 없는 프로세서에서는 동작이 공식적으로 정의되지 않는다. 일반적으로 DR4/5는 DR6/7로 별칭이 지정되지만, 예외가 존재하며 CPU 감지에 사용되었다.[10]

2. 3. DR6 (디버그 상태 레지스터)

디버그 상태 레지스터(DR6)는 디버거가 디버그 조건을 발생시키고 어떤 조건이 발생했는지 확인하는 데 사용된다. 프로세서는 활성화된 디버그 예외를 감지하면 디버그 예외 처리기에 진입하기 전에 이 레지스터의 해당 비트를 설정한다. DR6의 비트들은 프로세서에 의해 초기화되지 않으므로, 다음 디버그 예외 처리 시 다른 문제점을 피하기 위해 디버거 핸들러는 반환하기 전에 DR6를 0으로 채워야 한다.[4]

비트약어설명
0B0Breakpoint #0 조건 감지[4][1]
1B1Breakpoint #1 조건 감지[4][1]
2B2Breakpoint #2 조건 감지[4][1]
3B3Breakpoint #3 조건 감지[4][1]
10:4예약됨. 386/486 프로세서에서는 모두 0으로 읽고, 이후 프로세서에서는 모두 1로 읽는다.[2]
11BLD버스 잠금 트랩 예외에 대해 프로세서에 의해 0으로 지워진다.[3] 버스 잠금 트랩 예외를 지원하지 않는 프로세서에서 DR6의 비트 11은 읽기 전용 비트이며 비트 10:4와 동일한 방식으로 작동한다.
12BK,
SMMS
(386/486만 해당) SMM 또는 ICE 모드 진입[2] (DR7, 비트 12 참조). 이후 모든 프로세서에서 예약되어 있으며 0으로 읽는다.
13BD디버그 레지스터 액세스 감지[4] (DR7, 비트 13 참조).
14BS단일 단계 실행 (EFLAGS.TF에 의해 활성화됨)
15BT작업 전환 중단점.
T (디버그 트랩 플래그) 비트가 설정된 TSS로 작업 전환이 수행될 때 발생한다.
16RTM(인텔 TSX가 있는 프로세서만 해당) RTM 트랜잭션 내부의 디버그 예외에 대해 프로세서에 의해 0으로 지워지고, 트랜잭션 외부의 모든 디버그 예외에 대해 1로 설정된다. TSX가 없는 프로세서에서 DR6의 비트 16은 읽기 전용 비트이며 비트 31:17과 동일한 방식으로 작동한다.
31:17예약됨. 386/486/6x86 프로세서에서는 모두 0으로 읽고, 이후 프로세서에서는 모두 1로 읽는다.
63:32(x86-64만 해당) 예약됨. 모두 0으로 읽는다. 모두 0으로 써야 한다.


2. 4. DR7 (디버그 제어 레지스터)

DR7은 디버그 제어 레지스터로, 4개의 중단점(Breakpoint)을 설정하고 제어하는 데 사용된다. 각 중단점은 DR0~DR3 레지스터에 저장된 선형 주소와 연결되며, DR7 레지스터의 비트를 통해 활성화 여부, 조건, 길이 등을 설정할 수 있다.

DR7의 하위 8비트(0~7)는 4개의 주소 중단점을 선택적으로 활성화하는 데 사용된다. 각 중단점은 로컬(0, 2, 4, 6번 비트) 또는 전역(1, 3, 5, 7번 비트)으로 활성화할 수 있다. 로컬 활성화 비트는 태스크 전환 시 자동으로 초기화되어 현재 태스크에만 영향을 미치는 반면, 전역 활성화 비트는 태스크 전환 시에도 유지되어 모든 태스크에 영향을 미친다.

16~31번 비트는 중단점이 발생할 조건(R/W)과 길이(LEN)를 설정한다. 각 중단점은 2비트씩 할당되어 R/W와 LEN을 설정한다.

  • R/W (Read/Write) 비트 (16-17, 20-21, 24-25, 28-29번 비트): 중단점이 발생할 조건을 설정한다.


중단 시점
00명령어 실행만
01데이터 쓰기만
10I/O 읽기 및 쓰기 (CR4.DE = 1인 경우에만 정의됨)
11데이터 읽기 및 쓰기 (쓰기 전용이 아님)


  • LEN (Length) 비트 (18-19, 22-23, 26-27, 30-31번 비트): 중단점의 길이를 설정한다.


중단점 길이
001바이트
012바이트
108바이트 (64비트 모드에서만 정의됨)
114바이트

[11]

DR7 레지스터의 비트 구성은 다음과 같다.

비트약어설명
0L0중단점 #0에 대한 로컬 활성화
1G0중단점 #0에 대한 전역 활성화
2L1중단점 #1에 대한 로컬 활성화
3G1중단점 #1에 대한 전역 활성화
4L2중단점 #2에 대한 로컬 활성화
5G2중단점 #2에 대한 전역 활성화
6L3중단점 #3에 대한 로컬 활성화
7G3중단점 #3에 대한 전역 활성화
8LE(386 전용) 로컬 정확 중단점 활성화
9GE(386 전용) 전역 정확 중단점 활성화
10예약됨, 읽기 전용, 1로 읽고 1로 써야 함
11RTM(인텔 TSX가 있는 프로세서만) RTM 트랜잭션의 고급 디버깅 활성화 (DEBUGCTL 비트 15도 설정된 경우에만). 다른 프로세서: 예약됨, 읽기 전용, 0으로 읽고 0으로 써야 함.
12IR, SMIE(386/486 프로세서만) 중단점 일치 시 동작 설정. 0 = INT 1 (#DB 예외, 기본값), 1 = ICE/SMM으로 중단. 다른 프로세서: 예약됨, 읽기 전용, 0으로 읽고 0으로 써야 함.
13GD일반 감지 활성화. 설정하면 DR0-DR7 레지스터에 액세스하려는 시도에 대해 디버그 예외가 발생함
15:14예약됨, 모두 0으로 써야 함
17:16R/W0중단점 #0에 대한 중단점 조건
19:18LEN0중단점 #0에 대한 중단점 길이
21:20R/W1중단점 #1에 대한 중단점 조건
23:22LEN1중단점 #1에 대한 중단점 길이
25:24R/W2중단점 #2에 대한 중단점 조건
27:26LEN2중단점 #2에 대한 중단점 길이
29:28R/W3중단점 #3에 대한 중단점 조건
31:30LEN3중단점 #3에 대한 중단점 길이
32DR0_PT_LOGPTTT(Processor Trace Trigger Tracing)에 대한 트리거 입력으로 DR0/1/2/3 중단점 일치를 활성화함.[9] PTTT를 지원하지 않는 프로세서에서는 0으로 읽고 모두 0으로 써야 함
33DR1_PT_LOG
34DR2_PT_LOG
35DR3_PT_LOG
63:36(x86-64 전용) 예약됨. 모두 0으로 읽음. 모두 0으로 써야 함


3. 디버그 레지스터와 한국 관련 내용

(빈 문서)

참조

[1] 간행물 Software Developer's Manual http://kib.kiev.ua/x[...] Intel 2022-12
[2] 문서 OPCODE.LST http://phg.chat.ru/o[...] 1999-10-15
[3] 간행물 Intel® 64 and IA-32 Architectures Software Developer’s Manual https://kib.kiev.ua/[...] Intel 2023-03
[4] 서적 Programming the 80386 1987
[5] 간행물 Am386 Microprocessors for Personal Computers Data Book http://www.bitsavers[...] AMD 1992-10-15
[6] 웹사이트 Intel's System Management Mode https://web.archive.[...] 1997-01
[7] 웹사이트 Am386®SX/SXL/SXLV High-Performance, Low-Power, Embedded Microprocessors https://www.ardent-t[...] 1997-04
[8] 웹사이트 Undocumented bits in DR7 https://web.archive.[...]
[9] 간행물 Intel Architecture Instruction Set Extensions and Future Features https://cdrdv2-publi[...] Intel 2024-06
[10] 웹사이트 CPU Identification Before CPUID https://www.geoffcha[...] 2023-03-04
[11] 문서 GNU GDB 6.5 gdb/i386-nat.c



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com