세그먼트 기술자
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
세그먼트 기술자는 x86 및 x86-64 아키텍처에서 메모리 세그먼트를 정의하는 데 사용되는 데이터 구조이다. 이 기술자는 세그먼트의 기본 주소, 길이, 접근 권한, 유형 등 다양한 정보를 포함하며, CPU가 메모리에 접근하는 방식을 제어한다. 세그먼트 기술자는 다양한 필드로 구성되며, 각 필드는 세그먼트의 특성을 정의한다. 주요 필드로는 기본 주소, 세그먼트 제한, 세분성, 권한 레벨 등이 있으며, 이들의 설정에 따라 세그먼트의 크기, 접근 가능 여부, 권한 등이 결정된다.
더 읽어볼만한 페이지
- 운영 체제 커널 - 커널 (컴퓨팅)
커널은 운영 체제의 핵심으로, 하드웨어와 소프트웨어 간 상호 작용을 관리하며 시스템 보안, 자원 관리, 하드웨어 추상화, 프로세스 스케줄링, 프로세스 간 통신, 다중 작업 환경 지원 등의 기능을 제공하고, 모놀리식, 마이크로, 혼합형 커널 등으로 구현되며 가상화 및 클라우드 컴퓨팅 환경에서 중요성이 커지고 있다. - 운영 체제 커널 - 로더 (컴퓨팅)
로더는 운영 체제에서 프로그램을 메모리에 적재하고 실행하는 소프트웨어 구성 요소이며, 유닉스와 윈도우 등에서 실행 파일의 유효성 검사, 메모리 매핑, DLL 초기화 등의 작업을 수행한다. - 메모리 관리 - 동적 메모리 할당
동적 메모리 할당은 프로그램 실행 중 힙 영역에서 메모리 공간을 확보 및 해제하여 효율적인 메모리 관리와 유연성을 제공하는 기술로, 메모리 누수 방지 및 가비지 컬렉션 등의 고려 사항이 중요하며 C, C++, C++/CLI, C# 등에서 사용된다. - 메모리 관리 - 정적 변수
정적 변수는 프로그램 실행 시간 동안 값을 유지하며, C 언어에서 `static` 키워드로 정의되어 함수 호출 간에 값을 유지하고, 객체 지향 프로그래밍에서 클래스의 모든 인스턴스에서 공유되는 클래스 변수로 사용된다. - X86 아키텍처 - 물리 주소 확장
물리 주소 확장(PAE)은 x86 아키텍처에서 32비트 주소를 36비트 이상으로 확장하여 CPU가 4GB 초과 물리 메모리에 접근하도록 하는 기술로, 페이지 테이블 확장 및 추가 페이지 테이블을 통해 최대 64GB 메모리를 지원하며 AMD64 아키텍처에서 가상 주소 공간 확장에 사용되고 운영 체제, 칩셋, 마더보드의 지원이 필요하며 CPUID 플래그로 지원 여부를 확인한다. - X86 아키텍처 - X86 가상화
X86 가상화는 x86 아키텍처 기반 시스템에서 가상 머신을 구현하는 기술로, 소프트웨어 기반 가상화와 하드웨어 지원 가상화로 나뉘며, CPU 제조사의 가상화 확장 기술을 활용하여 가상 머신의 성능을 향상시킨다.
| 세그먼트 기술자 | |
|---|---|
| 개요 | |
![]() | |
| 종류 | 데이터 세그먼트, 코드 세그먼트, 시스템 세그먼트 기술 |
| 용도 | 메모리 관리 및 보안 |
| 관련 주제 | 전역 기술자 테이블, 지역 기술자 테이블, 세그먼트 주소 지정 |
| 설명 | |
| 역할 | 세그먼트의 속성 및 위치 정의 |
| 포함 정보 | 세그먼트의 시작 주소 (베이스 주소) 세그먼트의 크기 (세그먼트 제한) 세그먼트의 접근 권한 (읽기, 쓰기, 실행 등) 세그먼트 유형 (코드, 데이터, 시스템) |
| 구조 (16비트) | |
| 세그먼트 제한 (Segment Limit) | 16비트 |
| 베이스 (Base) | 24비트 |
| 속성 (Attribute) | 16비트 |
| 구조 (32비트) | |
| 세그먼트 제한 (Segment Limit) | 20비트 |
| 베이스 (Base) | 32비트 |
| 속성 (Attribute) | 12비트 |
| 속성 바이트 상세 (32비트) | |
| P (Present) | 세그먼트 존재 유무 (1: 유효, 0: 무효) |
| DPL (Descriptor Privilege Level) | 보안 레벨 (0-3, 높을수록 낮은 권한) |
| S (System) | 세그먼트 종류 (1: 코드/데이터, 0: 시스템) |
| Type (유형) | 세그먼트 유형 및 접근 권한 (코드, 데이터, 읽기, 쓰기 등) |
| G (Granularity) | 세그먼트 제한 단위 (0: 1바이트, 1: 4KB) |
| D/B (Default Operation Size/Big) | 코드 세그먼트의 기본 연산 크기 (1: 32비트, 0: 16비트) 또는 스택 세그먼트의 스택 포인터 크기 |
| L (Long Mode) | 코드 세그먼트의 64비트 코드 여부 (1: 64비트, 0: 32비트) |
| AVL (Available) | 운영체제가 사용 가능한 비트 |
2. 세그먼트 디스크립터 구조
x86 및 x86-64 아키텍처에서 사용되는 세그먼트 기술자는 메모리 세그먼트의 속성을 정의하는 중요한 데이터 구조이다. 이 기술자는 다음 그림과 같은 형식을 가진다.[3][6]
세그먼트 기술자는 여러 필드로 구성되며, 각 필드는 세그먼트의 기본 주소, 크기(세그먼트 제한), 접근 권한(권한 수준), 유형(코드, 데이터, 시스템 등) 및 기타 속성들을 지정한다.[3][6] 각 필드에 대한 자세한 설명은 하위 섹션에서 다룬다.
2. 1. 필드 설명
x86 및 x86-64 아키텍처에서 사용되는 세그먼트 기술자는 다음과 같은 구조를 가진다.[3][6]각 필드가 의미하는 바는 다음과 같다.[3]
; 기본 주소 (Base Address): 세그먼트가 시작되는 32비트 메모리 주소.[3][6]
; 세그먼트 제한 (Segment Limit): 세그먼트의 크기를 나타내는 20비트 길이의 값. 실제 크기는 G 비트에 따라 결정된다.[3][6]
; G (Granularity, 세분성): 세그먼트 제한 값의 단위를 결정하는 비트. 0이면 바이트 단위, 1이면 4KiB 페이지 단위이다.[3]
; D/B (Default/Big): 코드 세그먼트에서는 기본 피연산자 크기(D)를, 데이터 세그먼트에서는 최대 오프셋 크기(B)를 결정한다. 0이면 16비트, 1이면 32비트 모드를 의미한다.[3]
; L (Long): 64비트 코드 세그먼트임을 나타내는 비트. 이 비트가 1이면 D 비트는 0이어야 한다.[3]
; AVL (Available): 하드웨어가 사용하지 않고 운영체제 등 소프트웨어가 자유롭게 사용할 수 있는 비트.[3]
; P (Present): 세그먼트가 현재 메모리에 존재하는지 여부를 나타낸다. 0이면 접근 시 예외가 발생한다.[3]
; DPL (Descriptor Privilege Level): 해당 기술자에 접근하는 데 필요한 권한 수준(링)을 0에서 3까지의 값으로 나타낸다.[3][6]
; S (System Segment): 세그먼트의 종류를 나타낸다. 0이면 시스템 세그먼트, 1이면 코드 또는 데이터 세그먼트이다.[3]
; Type: 세그먼트의 구체적인 유형과 속성(읽기/쓰기/실행 권한 등)을 정의한다. S 비트 값에 따라 해석이 달라진다.[3] 하위 비트들은 다음과 같은 추가 속성을 나타낸다:
::; C (Conforming):: : 코드 세그먼트 속성으로, 낮은 권한 수준에서의 호출 가능 여부를 결정한다.[3]
::; E (Expand-down):: : 데이터 세그먼트 속성으로, 세그먼트 확장 방향을 결정한다. 주로 스택에 사용된다.[3]
::; R (Readable):: : 코드 세그먼트 속성으로, 읽기 가능 여부를 결정한다.[3]
::; W (Writable):: : 데이터 세그먼트 속성으로, 쓰기 가능 여부를 결정한다.[3]
; A (Accessed): 세그먼트에 접근이 있었는지 나타내는 비트. 하드웨어가 1로 설정하고 소프트웨어가 초기화한다.[3]
2. 1. 1. 기본 주소 (Base Address)
세그먼트의 시작 메모리 주소를 나타낸다. 길이는 32비트이며, 세 부분으로 나뉘어 기술자 내에 저장된다. 구체적으로는 하위 16비트(기술자 오프셋 2~3바이트), 중간 8비트(오프셋 4바이트), 그리고 상위 8비트(오프셋 7바이트)로 분산되어 위치한다.[3][6]2. 1. 2. 세그먼트 제한 (Segment Limit)
세그먼트 제한(Segment Limit)은 세그먼트의 크기를 나타내는 20비트 길이의 필드이다.[3] 이 값은 세그먼트 기술자 내에서 하위 16비트(비트 0~15)와 상위 4비트(비트 16~19)로 나뉘어 저장된다.[3] 세그먼트 제한은 해당 세그먼트에서 마지막으로 접근 가능한 데이터의 메모리 주소를 정의하며, 실제 세그먼트의 크기는 이 필드에 저장된 값보다 1 바이트 크다.[3]세그먼트 제한 값의 정확한 해석 방식은 세그먼트 기술자의 세분성(Granularity, G) 비트 설정에 따라 달라진다.[3]
- G 비트가 0으로 설정된 경우: 세그먼트 제한은 바이트 단위로 해석된다. 이 경우 세그먼트의 최대 크기는 220 바이트, 즉 1 메비바이트(MiB)가 된다.[3]
- G 비트가 1으로 설정된 경우: 세그먼트 제한은 4096바이트(페이지) 단위로 해석된다. 이 경우 세그먼트의 최대 크기는 220 × 4096 바이트, 즉 232 바이트 또는 4 기비바이트(GiB)까지 확장될 수 있다.[3]
2. 1. 3. G (Granularity, 세분성)
G 비트는 세분성(Granularity)을 의미하며, 세그먼트 제한(Segment Limit) 필드의 단위를 결정한다.[3] G 비트의 설정에 따라 세그먼트 제한 값의 해석 방식과 최대 크기가 달라진다.- '''G = 0''': 세그먼트 제한 값은 바이트 단위로 해석된다. 따라서 세그먼트의 최대 크기는 220 바이트, 즉 1 MiB가 된다.[3]
- '''G = 1''': 세그먼트 제한 값은 4096바이트(페이지) 단위로 해석된다. 즉, 세그먼트 제한 필드에 저장된 값에 4096 (또는 212)을 곱한 크기가 실제 세그먼트의 크기가 된다. 이 경우 세그먼트의 최대 크기는 220 × 4096 = 232 바이트, 즉 4 GiB까지 가능하다.[3]
2. 1. 4. D/B (Default/Big)
D/B 비트는 세그먼트 기술자 내에서 해당 세그먼트의 기본 크기 모드를 결정하는 중요한 플래그이다. 이 비트의 구체적인 의미는 해당 세그먼트가 코드 세그먼트인지 데이터 세그먼트(또는 스택 세그먼트)인지에 따라 달라진다.[3]- '''코드 세그먼트'''의 경우, 이 비트는 D (Default operand size) 비트로 해석된다.
- * D=0: 해당 코드 세그먼트는 16비트 명령어와 피연산자를 기본으로 사용하는 것으로 간주된다.
- * D=1: 해당 코드 세그먼트는 32비트 명령어와 피연산자를 기본으로 사용하는 것으로 간주된다.
- '''데이터 세그먼트'''의 경우, 이 비트는 B (Big) 비트로 해석된다.
- * B=0: 데이터 세그먼트의 최대 오프셋(세그먼트 내에서 접근 가능한 주소 범위)이 16비트 최대값인 0x0000ffff (65,535 바이트, 즉 64KB)로 제한된다. 만약 이것이 스택 세그먼트라면, 스택 포인터로 SP 레지스터를 사용한다.
- * B=1: 데이터 세그먼트의 최대 오프셋이 32비트 최대값인 0xffffffff (4,294,967,295 바이트, 즉 4GB)로 확장된다. 스택 세그먼트의 경우, 확장된 32비트 스택 포인터인 ESP 레지스터를 사용한다. 이는 스택의 크기가 64KB를 넘어설 수 있음을 의미한다.
본질적으로 데이터 세그먼트의 'B' 비트는 코드 세그먼트의 'D' 비트와 유사하게 세그먼트의 기본 작동 크기(16비트 또는 32비트)를 나타낸다.[3]
참고로, 64비트 모드(롱 모드)를 위한 코드 세그먼트에서는 L (Long) 비트가 사용되며, 이 L 비트가 1로 설정될 경우 D/B 비트는 반드시 0이어야 한다.[3]
2. 1. 5. L (Long)
L 비트는 해당 코드 세그먼트가 64비트용인지 나타내는 플래그이다.[3] 이 비트가 1로 설정되면, 해당 세그먼트는 x86-64 아키텍처의 64비트 모드에서 동작하는 코드 세그먼트임을 의미하며, 세그먼트 내의 코드는 64비트 명령어 인코딩 방식을 사용한다.[3][6] L 비트가 1일 경우, D 비트(기본 피연산자 크기 또는 빅 비트)는 반드시 0이어야 한다. 즉, L 비트와 D 또는 B 비트는 동시에 1로 설정될 수 없다.[3] 세그먼트 기술자 구조에서 L 비트는 21번째 비트에 위치한다.[3]2. 1. 6. AVL (Available)
AVL(Available) 비트는 세그먼트 기술자의 20번째 비트[3]로, 운영체제와 같은 시스템 소프트웨어가 특정 목적을 위해 자유롭게 사용할 수 있도록 예약된 공간이다.[3] 하드웨어는 이 비트를 사용하거나 그 값을 해석하지 않는다.[3]2. 1. 7. P (Present)
P 비트는 존재(Present) 플래그를 의미하며, 해당 세그먼트가 현재 메모리에 존재하는지 여부를 나타낸다.[3] 이 비트 값이 0이면, 해당 세그먼트는 메모리에 없다는 뜻이다. 만약 프로그램이 존재하지 않는 세그먼트에 접근하려고 시도하면, CPU는 "세그먼트 없음"(Segment Not Present) 예외(exception)를 발생시켜 운영체제에게 문제를 알린다.[3] 반대로 P 비트가 1이면, 해당 세그먼트는 메모리에 존재하며 정상적으로 접근할 수 있음을 의미한다.2. 1. 8. DPL (Descriptor Privilege Level, 디스크립터 권한 수준)
`DPL`은 서술자 권한 수준(Descriptor Privilege Leveleng)을 의미한다.[3] 이 필드는 해당 세그먼트 기술자에 접근하는 데 필요한 권한 수준(링)을 지정하는 값이다.[3] 권한 수준은 일반적으로 0부터 3까지의 값을 가지며, 숫자가 낮을수록 더 높은 권한을 나타낸다. 예를 들어, 링 0은 운영체제 커널과 같이 가장 높은 권한 수준을 의미하고, 링 3은 일반 응용 프로그램이 실행되는 가장 낮은 권한 수준을 나타낸다.2. 1. 9. S (System Segment)
`S` 필드는 세그먼트 기술자 내에서 해당 세그먼트가 시스템 세그먼트인지, 아니면 코드 또는 데이터 세그먼트인지를 나타내는 1비트 플래그이다.[3] 이 비트의 값에 따라 세그먼트의 종류와 용도가 구분된다.[3]- S = 0: 해당 세그먼트는 시스템 세그먼트임을 의미한다.[3] 시스템 세그먼트는 운영체제가 시스템 관리 목적으로 사용하는 특별한 세그먼트를 가리킨다. 예를 들어, 태스크 상태 세그먼트(TSS)나 로컬 디스크립터 테이블(LDT) 등이 시스템 세그먼트에 해당할 수 있다.
- S = 1: 해당 세그먼트는 코드 세그먼트 또는 데이터 세그먼트임을 의미한다.[3] 이는 일반적인 프로그램의 기계어 코드나 데이터를 저장하는 데 사용되는 세그먼트이다. 이 경우, 세그먼트 기술자의 다른 필드(예: Type 필드)를 통해 코드 세그먼트인지 데이터 세그먼트인지 구체적으로 구분된다.
2. 1. 10. Type (타입)
세그먼트 기술자 내의 Type 필드는 해당 세그먼트의 구체적인 종류와 속성을 정의한다. 이 필드는 S (System segment) 비트와 함께 해석되어 세그먼트의 역할을 결정한다.[3]- S 비트 (System segment): 이 비트는 해당 기술자가 시스템 세그먼트를 위한 것인지(S=0), 아니면 코드 또는 데이터 세그먼트를 위한 것인지(S=1)를 구분한다.[3]
- 코드 또는 데이터 세그먼트 (S=1):
- Type 필드의 특정 비트(원본 설명 상 비트 11)가 1이면 코드 세그먼트를 의미한다. 이 경우, Type 필드의 나머지 비트들은 다음과 같은 속성을 나타낸다.[3]
- C (Conforming): 1로 설정되면, 이 코드 세그먼트는 현재 실행 중인 코드보다 낮은 권한 수준(Ring)에서도 호출될 수 있다.[3]
- R (Readable): 0으로 설정되면 세그먼트는 실행만 가능하고 읽을 수는 없다. 1로 설정되면 읽기도 가능하다.[3]
- A (Accessed): 세그먼트에 접근이 발생하면 하드웨어가 이 비트를 1로 설정한다. 운영체제 등 소프트웨어는 주기적으로 이 비트를 0으로 초기화하여 세그먼트 사용 빈도를 파악할 수 있다.[3]
- Type 필드의 특정 비트(원본 설명 상 비트 11)가 0이면 데이터 또는 스택 세그먼트를 의미한다. 이 경우, Type 필드의 나머지 비트들은 다음과 같은 속성을 나타낸다. (코드 세그먼트의 C, R 플래그 대신 E, W 플래그가 사용된다.)[3]
- E (Expand-down): 0으로 설정되면 세그먼트는 Base 주소부터 Base+Limit까지 위쪽으로 확장된다. 1로 설정되면 세그먼트는 최대 오프셋(16비트 세그먼트에서는 0xFFFF, 32비트 세그먼트에서는 0xFFFFFFFF)부터 Limit+1까지 아래쪽으로 확장된다. 주로 스택 세그먼트에 사용된다.[3]
- W (Writable): 0으로 설정되면 데이터 세그먼트는 읽기만 가능하고 쓰기는 불가능하다. 1로 설정되면 쓰기도 가능하다.[3]
- A (Accessed): 코드 세그먼트의 A 비트와 동일한 역할을 한다.[3]
- 시스템 세그먼트 (S=0):
- S 비트가 0이면 해당 기술자는 시스템 세그먼트 또는 게이트(Gate) 기술자를 나타낸다. 이 경우 Type 필드의 4비트는 LDT(Local Descriptor Table), TSS(Task State Segment), 콜 게이트, 인터럽트 게이트, 트랩 게이트 등 더 구체적인 시스템 구조의 유형을 지정한다.[3]
2. 1. 11. A (Accessed, 접근됨)
A 비트는 '접근됨'(Accessed)을 의미한다. 이 비트는 해당 세그먼트에 하드웨어가 접근할 때 1로 설정되며, 소프트웨어에 의해 0으로 다시 설정(초기화)될 수 있다.[3]참조
[1]
서적
Understanding the Linux Kernel (First Edition)
O'Reilly & Associates, Inc.
[2]
서적
Advanced Microprocessors
https://archive.org/[...]
Mcgraw Hill Publishers
[3]
기술보고서
AMD64 Architecture Programmer's Manual Volume 2: System Programming
http://amd-dev.wpeng[...]
[4]
문서
[5]
서적
Advanced Microprocessors
https://books.google[...]
Mcgraw Hill Publishers
[6]
기술보고서
AMD64 Architecture Programmer's Manual Volume 2: System Programming
http://amd-dev.wpeng[...]
2017-03-11
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com
