맨위로가기

메모리 세그먼트

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

1. 개요

메모리 세그먼트는 프로그램을 세그먼트 단위로 관리하는 메모리 관리 기법으로, 주기억 장치와 보조 기억 장치 간의 데이터 이동을 통해 메모리 부족 문제를 해결한다. 각 세그먼트는 세그먼트 테이블을 통해 관리되며, 디스크립터, 디스크립터 테이블, 셀렉터 등의 자료 구조를 사용하여 논리 주소를 선형 주소로 변환한다. 하드웨어적으로는 세그먼트 ID와 오프셋을 물리 주소로 변환하고 접근 권한을 확인하며, 가상 메모리 구현 및 메모리 보호를 제공한다. 초기에는 버로스 B5000, GE 645 등에서 구현되었으며, x86 아키텍처에서도 리얼 모드, 보호 모드, 롱 모드 등 다양한 방식으로 적용되었다. 오브젝트 파일에서도 세그먼트 또는 섹션의 개념이 사용된다.

더 읽어볼만한 페이지

  • 메모리 관리 - 동적 메모리 할당
    동적 메모리 할당은 프로그램 실행 중 힙 영역에서 메모리 공간을 확보 및 해제하여 효율적인 메모리 관리와 유연성을 제공하는 기술로, 메모리 누수 방지 및 가비지 컬렉션 등의 고려 사항이 중요하며 C, C++, C++/CLI, C# 등에서 사용된다.
  • 메모리 관리 - 정적 변수
    정적 변수는 프로그램 실행 시간 동안 값을 유지하며, C 언어에서 `static` 키워드로 정의되어 함수 호출 간에 값을 유지하고, 객체 지향 프로그래밍에서 클래스의 모든 인스턴스에서 공유되는 클래스 변수로 사용된다.
  • 컴퓨터에 관한 - 고속 패킷 접속
    고속 패킷 접속(HSPA)은 3세대 이동통신(3G)의 데이터 전송 속도를 높이는 기술 집합체로, 고속 하향/상향 패킷 접속(HSDPA/HSUPA)을 통해 속도를 개선하고 다중 안테나, 고차 변조, 다중 주파수 대역 활용 등의 기술로 진화했으나, LTE 및 5G 기술 발전으로 현재는 상용 서비스가 중단되었다.
  • 컴퓨터에 관한 - 데이터베이스
    데이터베이스는 여러 사용자가 공유하고 사용하는 정보의 집합으로, 데이터베이스 관리 시스템을 통해 접근하며, 검색 및 갱신 효율을 높이기 위해 고도로 구조화되어 있고, 관계형, NoSQL, NewSQL 등 다양한 모델로 발전해왔다.
메모리 세그먼트

2. 세그먼트 방식의 기본 개념

프로세서가 논리 주소(Logical Address)를 선형 주소(Linear Address)로 변환하기 위해 사용하는 자료 구조는 다음과 같다.[1]


  • 디스크립터
  • 디스크립터 테이블
  • 셀렉터
  • 세그먼트 레지스터

2. 1. 주요 자료 구조

프로세서가 논리 주소(Logical Address)를 선형 주소(Linear Address)로 변환하기 위해 사용하는 자료 구조는 다음과 같다.[1]

  • 디스크립터 (Descriptors)
  • 디스크립터 테이블 (Descriptor Tables)
  • 셀렉터 (Selectors)
  • 세그먼트 레지스터 (Segment Registers)

2. 1. 1. 디스크립터 (Descriptors)

디스크립터는 세그먼트에 대한 정보를 담고 있는 64비트 크기의 자료 구조이다. 디스크립터는 세그먼트의 시작 주소, 크기, 접근 권한, 유형 등의 정보를 포함한다. 전체 64비트 중 32비트는 세그먼트의 시작 주소(0~0xFFFFFFFF)를, 20비트는 세그먼트의 크기(0~4GiB)를 나타낸다. 세그먼트 크기는 옵션에 따라 단위를 1Byte로 설정하면 최대 1MiB, 4KiB로 설정하면 최대 4GiB까지 지정할 수 있다.

2. 1. 2. 디스크립터 테이블 (Descriptor Tables)

8192(213)개의 디스크립터들을 모아 둔 테이블이며, 이 테이블의 시작 주소는 GDTR(Global Descriptor Table Register) 또는 LDTR(Local Descriptor Table Register)에 저장된다.

2. 1. 3. 셀렉터 (Selectors)

디스크립터를 가리키는 16비트 크기의 자료 구조이며, 전체 16비트 중 13비트는 디스크립터의 인덱스를 가리킨다. 1비트는 GDT(LDT)인지를 결정한다(1이면 LDT, 0이면 GDT). 2비트는 접근 권한을 가리킨다. 세그먼트 레지스터에 저장된다.

2. 1. 4. 선형 주소 접근 과정

프로세서는 논리 주소(Logical Address)를 선형 주소(Linear Address)로 변환하기 위해 다음과 같은 자료구조를 사용한다.

  • 디스크립터 (Descriptors)
  • 디스크립터 테이블 (Descriptor Tables)
  • 셀렉터 (Selectors)
  • 세그먼트 레지스터 (Segment Registers)


위 자료구조를 이용하여 프로세서가 선형 주소에 접근하는 과정은 다음과 같다.

# 셀렉터에 있는 디스크립터 인덱스에 8을 곱한 후, GDTR 또는 LDTR 값을 더해 디스크립터 주소를 얻는다.

# 디스크립터에 있는 베이스 주소(Base Address, 세그먼트의 시작 주소)를 이용하여 세그먼트의 시작 주소를 얻는다.

# 세그먼트의 시작 주소에 오프셋(Offset)을 더하여 원하는 데이터 주소를 얻는다.

# (페이징이 활성화되어 있는 경우) 페이지 해석을 추가로 실행한다. (페이징이 비활성화되어 있는 경우) 바로 데이터에 접근한다.

3. 하드웨어 구현

컴퓨터 메모리 주소는 세그먼트 ID와 세그먼트 내의 오프셋으로 구성된다.[17] 메모리 관리 장치(MMU)는 이들을 물리 주소로 변환하고, 변환 가능 여부와 참조 허용 여부를 확인한다.

각 세그먼트에는 길이와 ''읽기'', ''쓰기'', ''실행'' 등의 권한 집합이 연결되어 있다.[17] 프로세스 (컴퓨팅)는 참조 유형이 권한에 의해 허용되고 오프셋이 세그먼트 길이 내에 있을 때만 세그먼트를 참조할 수 있다. 그렇지 않으면 세그먼테이션 오류 같은 하드웨어 예외가 발생한다.

세그먼트는 가상 메모리 구현에도 사용된다. 이때 각 세그먼트에는 주 메모리 존재 여부를 나타내는 플래그가 연결된다. 주 메모리에 없는 세그먼트에 접근하면 예외가 발생하고, 운영 체제는 보조 저장 장치에서 해당 세그먼트를 읽어들인다.

세그먼테이션은 메모리 보호의 한 방법이며,[2] 페이징과 결합될 수도 있다. 세그먼트 크기는 가변적이며, 최소 1 바이트가 될 수 있다.[3]

MMU는 세그먼트와 오프셋으로 메모리 주소를 계산하고 접근 허용 여부를 확인한다.

3. 1. 페이징 없는 세그먼테이션

프로세서가 Linear Address에 접근하는 과정은 다음과 같다.[1]

1. Selector에 있는 Descriptor의 Index에 8을 곱한 후 GDTR 또는 LDTR 값을 더해 Descriptor의 주소를 얻는다.

2. Descriptor에 있는 Base Address(세그먼트의 시작 주소)를 사용해 세그먼트의 시작 주소를 얻는다.

3. 세그먼트의 시작 주소에 Offset을 더해 원하는 데이터 주소를 얻는다.

4. 페이징이 활성화되어 있는 경우 페이지 해석을 추가로 실행한다. 비활성화되어 있는 경우 바로 데이터에 접근한다.

각 세그먼트와 연관된 정보는 세그먼트가 메모리 내 어디에 위치하는지를 나타내며, 이를 ''세그먼트 베이스''라고 한다. 프로그램이 메모리 위치를 참조할 때, 오프셋은 세그먼트 베이스에 더해져 실제 메모리 주소를 생성한다.[1]

페이징 없이 세그먼테이션을 사용하는 시스템에서 가상 메모리를 구현하려면 전체 세그먼트가 메인 메모리와 보조 저장 장치 간에 스왑되어야 한다. 세그먼트가 스왑인될 때, 운영 체제는 전체 세그먼트를 저장하기에 충분한 연속적인 여유 메모리를 할당해야 한다. 충분한 양의 메모리가 있더라도 연속적인 메모리가 충분하지 않으면 종종 메모리 단편화가 발생한다.[1]

3. 2. 페이징을 사용한 세그먼테이션

프로세서가 Linear Address에 접근할 때, 세그먼트 정보는 메모리 위치 대신 세그먼트에 대한 페이지 테이블의 주소를 포함한다.[1]

프로그램이 메모리 위치를 참조하면, 오프셋은 페이지 테이블을 사용하여 메모리 주소로 변환된다.[1] 세그먼트는 다른 메모리 페이지를 할당하여 세그먼트의 페이지 테이블에 추가함으로써 확장할 수 있다.[1]

페이징을 사용하는 시스템에서 가상 메모리 구현은, 일반적으로 페이징을 사용하지 않는 세그먼트 시스템과 유사하게, 개별 페이지를 주 메모리와 보조 저장 장치 간에 이동시키는 방식으로 이루어진다.[1] 세그먼트의 페이지는 주 메모리 내 어디에나 위치할 수 있으며, 연속될 필요가 없다.[1] 이는 일반적으로 주 저장 장치와 보조 저장 장치 간의 입/출력 양을 줄이고 메모리 단편화를 줄이는 결과를 낳는다.[1]

4. 가상 기억 장치에서의 세그먼트 방식

운영 체제는 필요한 프로그램과 데이터를 주기억 장치에 읽어 들이는 '''롤인'''(roll-in) 방식으로 세그먼트를 관리한다. 주기억 장치에 빈 영역이 부족하면 불필요한 세그먼트를 보조 기억 장치로 내보내는 '''롤 아웃'''(roll-out)을 통해 필요한 영역을 확보한다.

각 세그먼트는 '''세그먼트 테이블'''로 관리되며, 여기에는 세그먼트 번호와 시작 물리 주소가 저장된다. 각 세그먼트에 속하는 프로그램이나 데이터의 실 주소는 세그먼트 테이블 내의 시작 주소와 해당 지점으로부터의 상대 주소를 통해 계산된다.

세그먼트는 실제 기억 장치 상에 연속된 영역으로 할당된다. 세그먼트의 크기는 가변적이기 때문에, 실제 기억 장치에 빈 영역의 총합은 충분하지만 연속된 빈 영역이 부족한 단편화 현상이 발생할 수 있다.[17]

4. 1. 페이지화 세그먼테이션 (다중 가상 기억)

페이지 테이블을 사용하여 프로그램이 메모리 위치를 참조할 때 오프셋을 메모리 주소로 변환한다. 세그먼트는 다른 메모리 페이지를 할당하여 세그먼트의 페이지 테이블에 추가함으로써 확장할 수 있다.[19]

세그먼트 방식과 페이징 방식을 조합한 방식이다. 이 방식에서는 프로그램 코드, 데이터 등 각 세그먼트가 여러 페이지로 구성된다. 이를 통해 하나의 세그먼트가 연속된 실제 메모리에 존재할 필요가 없어 외부 단편화를 방지하고 효율적으로 메모리를 사용할 수 있다. 또한 프로그램 코드용 세그먼트의 쓰기 금지와 같은 접근 제한이나, 읽기 전용 세그먼트를 프로그램 간에 공유하여 메모리 소비를 억제하는 등의 작업을 할 수 있다.[19]

페이지화 세그멘테이션은 MULTICS[19]나 ACOS-4의 메모리 관리에 채용되었다.

4. 2. 플랫 메모리 모델에서의 세그먼테이션

페이징을 지원하는 시스템에서도 하나의 (가상) 주소 공간을 분할하여 세그먼트를 구현하는 경우가 있다. 예를 들어, 프로세스가 사용하는 코드, 데이터 및 스택을 각각 0x1000부터 0x2000까지의 코드 세그먼트, 0x2000부터 0x4000까지의 데이터 세그먼트, 0xe000부터 0xffffff까지의 스택 세그먼트에 배치하여 사용할 수 있다. 하드웨어가 이러한 방식의 세그먼테이션을 지원하면 각 영역에 대해 데이터 실행 방지와 같은 보호를 세그먼트별로 수행할 수 있다.[20]

이 경우 CPU 아키텍처의 호환성이 높아지지만, 프로세스 간에 세그먼트를 공유할 때 페이지 테이블을 공유하여 메모리 사용량을 줄이는 장점은 없어진다.

리눅스는 이 방식을 채택하고 있다.[20]

5. 역사

버로스사의 버로스 B5000은 세그먼테이션을 구현한 초기 컴퓨터 중 하나이며, 세그먼테이션 기반 가상 메모리를 제공한 최초의 상업용 컴퓨터일 수 있다.[4] B6500 컴퓨터 역시 세그먼테이션을 구현했으며, 이 아키텍처의 한 버전은 오늘날 유니시스 ClearPath Libra 서버에서 여전히 사용되고 있다.

GE 645는 GE-635를 수정하여 세그먼테이션과 페이징 지원을 추가한 컴퓨터로, 1964년에 Multics를 지원하기 위해 설계되었다.

1975년에 개발이 시작된 인텔 iAPX 432[23] 마이크로프로세서에서 메모리 보호 기능을 갖춘 진정한 세그먼트 아키텍처를 구현하려 시도했다.

인텔 i960 프로세서의 960MX 버전은 객체에 대한 "액세스 디스크립터"와 객체 내 오프셋을 갖는 로드 및 저장 명령을 지원했다.

프라임 컴퓨터, 스트라투스 테크놀로지스, 아폴로 컴퓨터, IBM 시스템/38, 및 IBM AS/400(IBM i 포함) 컴퓨터는 메모리 세그먼테이션을 사용한다.[24]

5. 1. 초기 세그먼트 방식 구현

버로스사의 버로스 B5000 컴퓨터는 세그먼테이션을 처음으로 구현한 컴퓨터 중 하나였으며, 세그먼테이션 기반의 "가상 메모리"를 제공하는 최초의 상업용 컴퓨터일 수 있다.[4] B5000은 프로그램 참조 테이블(PRT)이라는 세그먼트 정보 테이블을 갖추고 있는데, 해당 세그먼트가 주 메모리에 있는지 여부를 나타내고, 기저 주소 및 세그먼트의 크기를 유지하는 데 사용되었다.[5]

GE 645 컴퓨터는 GE-635를 세그먼테이션과 페이징 지원을 추가하여 수정한 것으로, 1964년에 Multics를 지원하기 위해 설계되었다.

1975년에 시작된 인텔 iAPX 432[6] 마이크로프로세서에서 메모리 보호 기능을 갖춘 진정한 세그먼트 아키텍처를 구현하려 시도했다.

5. 2. 다양한 컴퓨터 시스템에서의 세그먼트 방식

버로스사의 버로스 B5000 컴퓨터는 세그먼테이션을 처음으로 구현한 컴퓨터 중 하나였으며, 세그먼테이션 기반의 "가상 메모리"를 제공하는 최초의 상업용 컴퓨터일 수 있다.[4] B5000은 프로그램 참조 테이블(PRT)이라는 세그먼트 정보 테이블을 갖추고 있었는데, 이 테이블은 해당 세그먼트가 주 메모리에 있는지 여부를 나타내고, 기저 주소 및 세그먼트의 크기를 유지하는 데 사용되었다.[5] 이후의 B6500 컴퓨터 역시 세그먼테이션을 구현했으며, 이 아키텍처의 한 버전은 오늘날 유니시스 ClearPath Libra 서버에서 여전히 사용되고 있다.

GE 645 컴퓨터는 GE-635를 세그먼테이션과 페이징 지원을 추가하여 수정한 것으로, 1964년에 Multics를 지원하기 위해 설계되었다.

1975년에 시작된 인텔 iAPX 432[6] 마이크로프로세서에서 메모리 보호 기능을 갖춘 진정한 세그먼트 아키텍처를 구현하려 시도했다.

인텔 i960 프로세서의 960MX 버전은 소스 또는 대상이 객체에 대한 "액세스 디스크립터"이고, 객체 내 오프셋을 갖는 로드 및 저장 명령을 지원했으며, 액세스 디스크립터는 32비트 레지스터에 있고 오프셋은 다음 레지스터의 기본 오프셋과 명령에 지정된 추가 오프셋 및 선택적으로 인덱스 레지스터에서 계산되었다. 액세스 디스크립터는 권한 비트와 26비트 객체 인덱스를 포함하며, 객체 인덱스는 객체 유형, 객체 길이 및 객체 데이터의 물리적 주소, 객체에 대한 페이지 테이블 또는 객체에 대한 2단계 페이지 테이블의 최상위 페이지 테이블을 제공하는 객체 디스크립터 테이블의 인덱스이며, 객체 유형에 따라 다르다.[7]

프라임 컴퓨터, 스트라투스 테크놀로지스, 아폴로 컴퓨터, IBM 시스템/38, 및 IBM AS/400(IBM i 포함) 컴퓨터는 메모리 세그먼테이션을 사용한다.[24]

6. 아키텍처별 구현 예시

벌로스 대형 시스템, Multics, IBM System/370, x86 아키텍처 등 다양한 시스템에서 메모리 세그먼트 방식이 구현되었다.


  • Burroughs 대형 시스템: B5000 시리즈부터 시작하여 세그먼트 방식을 사용했다. 48비트 단어와 3비트 태그를 사용하여 데이터 유형과 디스크립터를 구분했다.
  • Multics: 초기 운영 체제 중 하나로, 각 세그먼트에 별도 주소 공간을 할당하여 메모리 보호와 공유를 용이하게 했다.
  • IBM System/370: 가상 기억 장치(DAT)와 24비트/31비트 주소를 사용하며, 제어 레지스터와 세그먼트 테이블을 통해 메모리를 관리했다. 세그먼트 보호 및 공유 기능도 추가되었다.
  • x86 아키텍처:
  • 리얼 모드: 인텔 8086에서 사용된 초기 방식으로, 메모리 보호 없이 16비트 세그먼트 레지스터를 사용해 1MiB 메모리 주소 지정을 지원했다. 세그먼트 레지스터 값에 16을 곱하고 오프셋을 더하는 방식으로 실제 주소를 계산했다.
  • 보호 모드: 인텔 80286에서 도입되어 세그먼트별 메모리 보호 기능을 제공하고, 24비트(16MiB) 물리 주소 공간을 지원했다. 인텔 i386 이후에는 32비트 주소 지정과 페이징을 함께 사용하며, 대부분의 운영 체제는 페이징을 주로 활용했다.
  • 롱 모드: x86-64 아키텍처에서는 세그먼테이션을 지원하지 않으며, CS, SS, DS, ES 레지스터는 0으로 강제 설정된다. 단, FS와 GS 레지스터는 특수 용도로 사용될 수 있다.


x86 아키텍처의 C 언어 메모리 모델은 다음과 같다.

모델설명
타이니(Tiny)코드와 데이터 모두 동일한 64KiB 안에 들어가는 COM 파일 형식
스몰(Small)코드와 데이터 각각 모두 64KiB 이내
컴팩트(Compact)데이터만 64KiB보다 큼
미디엄(Medium)코드만 64KiB보다 큼
라지(Large)코드와 데이터 양쪽 모두 64KiB보다 큼
휴지(Huge)하나의 배열 등이 64KiB보다 커지는 것도 고려


6. 1. Burroughs 대형 시스템 아키텍처

벌로스 대형 시스템은 B5000, B5500, B5700, B6500 등의 시스템을 포함하며, 이들 시스템에서는 메모리 관리를 위해 세그먼트 방식을 구현했다.

6. 1. 1. B5000, B5500 및 B5700

B5000, B5500 및 B5700의 단어는 48비트 길이이다.[8] 디스크립터는 단어에서 최상위 비트가 설정되어 있으며, 프로그램 참조 테이블(PRT) 또는 스택에 존재한다. 디스크립터는 데이터가 메모리에 있는지 여부를 나타내는 "존재 비트"를 포함하며, 데이터 디스크립터와 프로그램 디스크립터로 구분된다.[8]

6. 1. 2. B6500, B7500 및 후속 기종

B6500과 후속 기종의 워드는 48비트의 데이터와 3개의 태그 비트를 갖는다.[9] 태그 비트는 워드에 포함된 데이터의 유형을 나타내며, 서로 다른 태그 비트 값으로 표시되는 여러 종류의 디스크립터가 있다.[9]

해당 라인에는 B6500, B6700, B7700, B6800, B6900, B5900, A 시리즈 버로스(Burroughs) 및 유니시스(Unisys) 기기, 현재의 클리어패스 MCP(Clearpath MCP) 시스템(리브라)이 포함된다. 수년에 걸쳐 몇 가지 개선 사항, 특히 하드웨어 발전이 있었지만, 아키텍처는 거의 변하지 않았다. 세분화 방식은 동일하게 유지되었으며, 세분화된 메모리를 참조하면 된다.

6. 2. Multics 아키텍처

Multics는 세그먼트 방식을 사용하여 메모리 관리를 구현한 초기 운영 체제 중 하나이다. Multics에서 각 세그먼트는 별도의 주소 공간을 가지며, 프로세스는 세그먼트 번호와 오프셋을 사용하여 메모리에 접근한다. 이러한 방식은 메모리 보호 및 공유를 용이하게 해준다.

6. 3. S/370 아키텍처

IBM System/370 모델[11][12]은 가상 기억 장치(DAT)와 24비트 주소를 사용한다. 제어 레지스터 0은 64 KiB 또는 1 MiB의 세그먼트 크기와 2 KiB 또는 4 KiB의 페이지 크기를 지정한다. 제어 레지스터 1에는 세그먼트 테이블의 길이와 실제 주소를 지정하는 세그먼트 테이블 지정자(STD)가 포함되어 있다. 각 세그먼트 테이블 항목에는 페이지 테이블 위치, 페이지 테이블 길이 및 무효 비트가 포함되어 있다. IBM은 나중에 주소 크기를 31비트로 확장하고 세그먼트 테이블 항목에 두 비트를 추가했다.

추가된 비트는 다음과 같다.

;세그먼트 보호 비트

:세그먼트를 읽기 전용으로 설정한다.

;공통 세그먼트 비트

:세그먼트가 주소 공간 간에 공유되도록 설정한다. 이 비트는 TLB 사용을 최적화한다.

IBM의 각 DAT 구현에는 변환 색인 버퍼(TLB)라고 부르는 변환 캐시가 포함되어 있다. "Principles of Operation"에서는 TLB에 대해 일반적인 용어로 설명하지만, 세부 사항은 아키텍처의 일부가 아니며 모델마다 다르다.

3031, 3032 및 3033 프로세서 복합체부터 IBM은 ''이중 주소 공간''(DAS) 기능을 제공했다. DAS는 프로그램이 기본 주소 공간(CR1) 및 보조 주소 공간(CR7)이라고 하는 두 개의 주소 공간에 대한 변환 테이블 간을 전환하고, 보호 키에 따라 주소 공간 간에 데이터를 이동할 수 있도록 한다. DAS는 16비트 주소 공간 번호(ASN)를 STD로 변환하는 변환 테이블을 지원하며, STD를 CR1(기본) 또는 CR7(보조)에 로드하는 권한 있는 명령어가 있다.

6. 4. x86 아키텍처

인텔 8086부터 시작된 x86 프로세서는 초기에는 메모리 세그먼테이션을 제공했지만, 메모리 보호 기능은 없었다. 16비트 세그먼트 레지스터는 65,536개의 세그먼트를 허용했고, 각 세그먼트는 64KiB의 주소 공간에 대한 읽기/쓰기 접근을 허용했다. 이러한 초기 x86 CPU의 작동 모드는 이후 "리얼 모드"로 명명되었다.

인텔 80286 프로세서에는 세그먼트별 메모리 보호 기능을 추가한 "286 보호 모드"가 도입되었다. 하위 호환성을 위해 모든 x86 CPU는 "리얼 모드"로 시작한다. 80286 또는 이후 프로세서가 전체 24비트(16MiB) 물리적 주소 공간과 고급 MMU 기능을 사용하려면 소프트웨어에 의해 "보호 모드"로 전환되어야 했다.

인텔 i386 및 이후 프로세서는 32비트 주소 지정을 지원하고, 세그먼테이션과 메모리 페이징을 함께 사용하는 "386 보호 모드"를 추가했다. 이 프로세서들에서 세그먼트 테이블은 세그먼트 주소를 ''선형 메모리''에 포함했고, 페이징이 활성화되면 선형 메모리의 주소는 별도의 페이지 테이블을 사용하여 물리적 주소로 매핑되었다. 대부분의 운영 체제는 세그먼테이션 기능을 거의 사용하지 않고 페이징을 주로 활용했다.

x86-64 아키텍처는 "롱 모드"(64비트 모드)에서 세그먼테이션을 지원하지 않는다.[15] CS, SS, DS, ES 세그먼트 레지스터는 0으로 강제 설정되며, 제한은 264이다. 단, FS 및 GS 세그먼트 레지스터는 여전히 0이 아닌 기본 주소를 가질 수 있어, 운영 체제가 스레드 로컬 저장소와 같은 특수 용도로 사용할 수 있다.[13][14]

6. 4. 1. 리얼 모드

인텔 8086은 초기 x86 프로세서로, 메모리 세그먼테이션을 사용했지만 메모리 보호는 제공하지 않았다. 모든 프로그램은 모든 세그먼트의 모든 바이트에 접근할 수 있었다. 16비트 세그먼트 레지스터는 65,536개의 세그먼트를 허용했으며, 각 세그먼트는 세그먼트 번호의 16배에 해당하는 고정된 오프셋에서 시작했다. 세그먼트 시작 주소는 16바이트 단위로 지정할 수 있었다. 각 세그먼트는 64KiB(65,536바이트) 크기의 주소 공간에 대해 읽기-쓰기 접근을 허용했다. 이 크기 제한은 16비트 PC 및 SP 레지스터에 의해 설정되었으며, 프로세서는 경계 검사를 수행하지 않았다. 오프셋과 주소의 합이 0xFFFFF를 초과하면 0x00000으로 랩어라운드되었다. 각 64KiB 세그먼트는 다음 4,095개의 세그먼트와 겹쳤으며, 각 물리적 주소는 4,096개의 세그먼트-오프셋 쌍으로 나타낼 수 있었다. 이 방식으로는 1MiB(1024KiB) 크기의 물리적 메모리(및 메모리 맵 I/O)만 주소 지정이 가능했다. 선택적으로 확장 메모리 하드웨어를 사용하면 소프트웨어 제어를 통해 뱅크 전환 메모리를 추가할 수 있었다. 인텔은 이러한 x86 CPU 모델의 유일한 작동 모드를 이후 "리얼 모드"라고 명명했다.

인텔 80286 및 이후 프로세서들은 16비트 주소 지정을 유지하면서 세그먼테이션(페이징 없음) 및 세그먼트별 메모리 보호 기능을 추가한 "286 보호 모드"를 도입했다. 모든 x86 CPU는 하위 호환성을 위해 "리얼 모드"로 시작하며, 이 모드는 동일한 고정된 겹침 구조의 64KiB 세그먼트, 메모리 보호 없음, 1MiB 물리적 주소 공간, 그리고 몇 가지 미묘한 차이점(하이 메모리 영역, 언리얼 모드)을 가진다.

x86의 리얼 모드(808680286 이후 프로세서의 리얼 모드) 프로그래밍 모델에는 "세그먼트 레지스터"가 있지만, 그 동작 방식은 앞서 설명한 주소 지정 기법과는 전혀 다르다. 이 모드에서는 메모리 보호나 가상 주소가 제공되지 않는다.

이 프로세서들 또는 리얼 모드의 프로그래밍 모델에서 주소 공간은 20비트(1MiB)이지만, 주소 레지스터와 일반적인 명령 형식의 주소 지정 필드는 16비트이다. 이 값을 "오프셋"이라고 한다. 세그먼트 레지스터의 크기 또한 16비트이다. 실제 주소는 "세그먼트 레지스터 값 × 16 + 오프셋"으로 계산되며, 8086에서 1MiB의 전체 주소 공간에 접근하는 이 방식을 "세그먼트"라고 불렀다.

8086에는 CS, DS, SS, ES의 4개의 16비트 "세그먼트 레지스터"가 있으며, 메모리 접근 종류에 따라 암묵적으로 선택된다. 명령어 페치는 CS, 데이터 읽기 및 쓰기는 DS, 스택 접근은 SS 레지스터가 사용된다. 이러한 암묵적 선택 외에도, 세그먼트 오버라이드 프리픽스라는 명령 전치 수식 기능을 통해 특정 세그먼트 레지스터를 명시적으로 선택할 수도 있다.

6. 4. 2. 메모리 모델

8086의 C 언어에서의 "메모리 모델"은 명령어 집합 아키텍처적인 사양에 대응하기 위한 규약과 같은 것이다. 8086에서는 세그먼트를 넘나들지 않고 접근할 수 있는 메모리의 범위는 64KiB(65,536 바이트)이므로, 코드나 데이터량이 그 범위 안에 들어간다면 암묵적인 세그먼트 지정만으로 어드레싱하는 코드로 하는 것이 효율적이다.

코드와 데이터 크기에 따라 다음과 같은 모델로 나뉜다.

모델설명
타이니(Tiny)코드와 데이터 모두 동일한 64KiB 안에 들어가는 COM 파일 형식이다.
스몰(Small)코드와 데이터 각각 모두 64KiB 이내이다.
컴팩트(Compact)데이터만 64KiB보다 크다.
미디엄(Medium)코드만 64KiB보다 크다.
라지(Large)코드와 데이터 양쪽 모두 64KiB보다 크다.
휴지(Huge)하나의 배열 등이 64KiB보다 커지는 것도 고려한다.



애플리케이션의 규모 등에 따라 적절한 메모리 모델을 사용했다.

6. 4. 3. 프로텍트 모드

인텔 80286 프로세서에는 16비트 주소 지정을 유지하고 세그먼테이션(페이징 없이) 및 세그먼트별 메모리 보호를 추가한 "286 프로텍트 모드"가 추가되었다. 모든 x86 CPU는 하위 호환성을 위해 "리얼 모드"로 시작하며, 동일한 고정된 겹치는 64 KiB 세그먼트, 메모리 보호 없음, 1 MiB 물리적 주소 공간 및 몇 가지 미묘한 차이점(하이 메모리 영역, 언리얼 모드)을 갖는다. 80286 또는 이후 프로세서가 전체 24비트(16 MiB) 물리적 주소 공간과 고급 MMU 기능을 사용하려면 소프트웨어(일반적으로 운영 체제 또는 DOS 확장자)에 의해 "보호 모드"로 전환되어야 한다.[13][14]

80286의 프로텍트 모드에서는 세그먼트 레지스터가 GDT(Global Descriptor Table, 전역 디스크립터 테이블)·LDT(Local Descriptor Table, 지역 디스크립터 테이블) 등으로 표시되는 세그먼트를 선택하는 세그먼트 셀렉터로 변경되었다. 전체 주소 공간은 24비트 (16MiB)로 확대되었지만, 오프셋은 16비트 그대로였다.

인텔 i386 및 이후 프로세서는 32비트 주소 지정을 사용하고 세그먼테이션을 유지하며 메모리 페이징을 추가한 "386 보호 모드"를 추가했다. 이 프로세서들에서 세그먼트 테이블은 세그먼트에 대한 페이지 테이블을 가리키는 대신, 세그먼트 주소를 ''선형 메모리''에 포함한다. 페이징이 활성화되면 선형 메모리의 주소는 별도의 페이지 테이블을 사용하여 물리적 주소로 매핑된다. 대부분의 운영 체제는 세그먼테이션 기능을 사용하지 않고, 모든 세그먼트 레지스터의 기본 주소를 항상 0으로 유지하고, 페이징만 사용하여 페이지별 메모리 보호 및 스와핑을 제공한다. 일부는 실행 가능 공간 보호를 제공하기 위해 CS 레지스터를 사용하거나, NX 비트가 없는 프로세서에서 FS 또는 GS 레지스터를 사용하여 스레드 로컬 저장소에 접근한다.[13][14] 80386 (IA-32)의 프로텍트 모드에는 페이징 방식(페이지화 세그멘테이션)도 도입되어, 물리적·논리적으로 모두 32비트가상 메모리 기능을 갖게 되었다. 오프셋은 32비트로 확장되었으며, FS와 GS라는 세그먼트 레지스터가 추가되었다.

x86-64 아키텍처는 "롱 모드"(64비트 모드)에서 세그먼테이션을 지원하지 않는다.[15] CS, SS, DS, ES의 네 개 세그먼트 레지스터는 0으로 강제 설정되며, 제한은 264이다. 세그먼트 레지스터 FS 및 GS는 여전히 0이 아닌 기본 주소를 가질 수 있다. 이를 통해 운영 체제는 스레드 로컬 저장소와 같은 특수 용도로 이러한 세그먼트를 사용할 수 있다.[13][14] x64에서 마이크로소프트 윈도우의 x64 버전은 GS 세그먼트 레지스터가 스레드 로컬 스토리지에 대한 포인터를 가리키도록 되어 있으며, 리눅스 커널에서는 GS가 CPU 단위의 데이터를 가리킨다.

7. 오브젝트 파일

오브젝트 파일에서도 세그먼트 또는 섹션이 정의되어 있다. 다른 오브젝트 파일에 있는 세그먼트들은 세그먼트 정의 시 지정된 규칙에 따라 링커에 의해 결합된다.[1]

ELF에서는 실행 파일 및 공유 라이브러리를 실행하기 위해 로드할 때 사용하는 프로그램 헤더에서 세그먼트라는 용어를 사용한다.[1] 이는 링크 시 등에 사용하는 섹션과는 다른 추상도를 가지는 것으로, 세그먼트 방식에서 유래한 명칭이다.[1]

참조

[1] 서적 AMD64 Technology AMD64 Architecture Programmer's Manual Volume 2: System Programming https://www.amd.com/[...] Advanced Micro Devices 2018
[2] 서적 Operating Systems: Three Easy Pieces Arpaci-Dusseau Books 2014
[3] 서적 Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3 (3A, 3B & 3C): System Programming Guide http://download.inte[...] Intel Corporation 2012
[4] 웹사이트 The Architecture of the Burroughs B5000 - 20 Years Later and Still Ahead of the Times? http://www.smecc.org[...] 2012-03-15
[5] 서적 Computer Architecture and Organization McGraw-Hill 1978
[6] 서적 Introduction to the IAPX 432 Architecture http://bitsavers.org[...] Intel Corporation 1981
[7] 서적 BiiN CPU Architecture Reference Manual http://bitsavers.org[...] BiiN 1998-07
[8] 간행물 The Operational Characteristic of the Processors for the Burroughs B 5000 https://bitsavers.or[...] Burroughs
[9] 서적 B6500 Information Processing Systems Reference Manual http://www.bitsavers[...] Burroughs 1969-09
[10] 서적 IBM System/370 Principles of Operation http://www.bitsavers[...] IBM 1974-09
[11] 서적 IBM System/370 Principles of Operation IBM 1987-09
[12] 서적 IBM System/370 Extended Architecture Principles of Operation http://bitsavers.org[...] IBM 1987-01
[13] 웹사이트 Everything You Need To Know To Start Programming 64-Bit Windows Systems https://learn.micros[...] Microsoft 2006-05
[14] 웹사이트 ELF Handling For Thread-Local Storage http://www.akkadia.o[...] 2013-08-22
[15] 서적 AMD64 Technology AMD64 Architecture Programmer's Manual Volume 2: System Programming https://www.amd.com/[...] Advanced Micro Devices 2018
[16] 논문 Program Organization and Record Keeping for Dynamic Storage Allocation 1961
[17] conference System Design of a Computer for Time Sharing Applications https://multicians.o[...] 1965
[18] 서적 The architecture of computer hardware and systems software Wiley 2003
[19] 웹사이트 The Multics Virtual Memory http://www.multician[...] 2012-02-12
[20] 웹사이트 情報科学類 オペレーティングシステム II 授業内容メモ 「メモリ管理、アドレス空間、ページテーブル」 (筑波大学情報工学研究科) http://www.coins.tsu[...] 2012-02-12
[21] 서적 Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B & 3C): System Programming Guide http://download.inte[...]
[22] 웹사이트 The Architecture of the Burroughs B5000 - 20 Years Later and Still Ahead of the Times? http://www.smecc.org[...] 2012-03-15
[23] 서적 Introduction to the IAPX 432 Architecture http://www.bitsavers[...]
[24] 웹사이트 Multics General Info and FAQ http://www.multician[...] 2012-03-18



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

문의하기 : help@durumis.com