맨위로가기

세그먼트 기술자

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의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]

x86 및 x86-64 세그먼트 기술자 구조


세그먼트 기술자는 여러 필드로 구성되며, 각 필드는 세그먼트의 기본 주소, 크기(세그먼트 제한), 접근 권한(권한 수준), 유형(코드, 데이터, 시스템 등) 및 기타 속성들을 지정한다.[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