2010-02-27 3 views
4

리얼 모드 세그먼트 메모리 모델에서 세그먼트는 항상 단락 경계에서 시작됩니다. 단락은 16 바이트이므로 세그먼트 주소는 항상 16으로 나눌 수 있습니다. 단락 경계에서 세그먼트를 갖는 이유/이점은 무엇입니까?세그먼트가 단락 경계에서 시작하는 이유는 무엇입니까?

+0

숙제 태그가 필요합니까? –

+0

"프로그래밍 질문이 아닙니다."가 필요합니다. –

+0

음 ... 사실, 리눅스에서 단계별 어셈블리 언어로 작업하고 있는데 단락 경계에서 세그먼트를 유지하는 이유를 알 수 없습니다. – pug

답변

4

8086의 리얼 모드 세분화 모델은 세그먼트 레벨 레지스터가 단락 경계를 지정하도록 하드웨어 수준에서 설계되었습니다.

세그먼트 레지스터가 8086의 20 비트 주소 공간의 상위 16 비트의 기본 주소를 지정하면 해당 기본 주소의 하위 4 비트는 본질적으로 0이됩니다.

세그먼트 아키텍처는 8086의 16 비트 레지스터 아키텍처에서 전체 메가 바이트 (!)의 주소 공간 (20 비트의 주소 지정 필요)을 처리 할 수있는 한 가지 방법이었습니다.

조금 더 많은 역사가 있긴하지만 Intel이 x86 아키텍처를 도입 한 다음 단계는 세그먼트 레지스터를 추상화하여 기본 주소를 직접 정의하는 것입니다. 그것은 286 보호 모드였습니다. 세그먼트 레지스터는 물리적 인 주소에 대한 정보를 보유한 디스크립터 테이블 집합에 대한 인덱스와 물리적 인 기본 주소에 대한 비트를 정의하는 대신에 물리적 인 기억, 그리고 다른 것들.

현대 32 비트 또는 그 이상의 x86 프로세서의 세그먼트 레지스터는 여전히 그렇게합니다. 그러나 선택기에 의해 정의 된 세그먼트 내에서 가상 메모리 의미를 제공 할 수있는 전체 32 비트 주소 지정 (x64 프로세서에서 64 비트) 및 페이지 테이블을 지정할 수있는 주소 오프셋을 사용하면 프로그래밍 모델은 기본적으로 응용 프로그램 수준에서 세그먼트 레지스터를 조작해야합니다. 대부분의 경우 OS는 세그먼트 레지스터를 한 번 설정하고 다른 것은 처리 할 필요가 없습니다. 따라서 프로그래머는 일반적으로 더 이상 존재하지 않는다고 할 필요조차 없습니다.

+0

세그먼트가 일부 상황에서 다시 발생합니다. 리눅스에서 스레드 로컬 저장소 구현. 스레드 로컬 변수는 고정 오프셋을 통해 액세스하지만 커널이 각 스레드마다 다르게 설정하는 'gs' 세그먼트 레지스터를 사용합니다. 다시 컴파일러는 프로그래머를 괴롭히지 않고이를 처리합니다. –

2

8086에는 20 개의 주소 라인이 있습니다. 세그먼트는 맨 아래의 4 줄 또는 16 개의 주소의 오프셋을 남기고 상위 16 개에 매핑되었습니다.

0

세그먼트 레지스터는 해당 세그먼트가으로 시작하는 메모리 위치 의 주소를 저장합니다. 그러나 세그먼트 레지스터는 16 비트 정보를 저장합니다. 이 16 비트는 주소의 오른쪽 끝에 0의 4 비트를 추가하여 20 비트로 변환됩니다. 세그먼트 레지스터에 1000H가 포함되어 있으면 10000H가되도록 왼쪽으로 시프트됩니다. 이제는 20 비트입니다.

변환하는 동안 우리는 주소의 끝에 4 비트를 추가했습니다. 그래서 메모리의 모든 세그먼트는 마지막 4 비트는 메모리 위치 로 시작해야합니다 0 예를 들어

: 세그먼트가 10001H 메모리 위치에서 시작하는 경우

, 우리는 마지막 4 있기 때문에 액세스 할 수 없습니다 비트는 0이 아닙니다. 세그먼트 레지스터의 모든 주소에는 오른쪽 끝에 4 비트가 추가되어 20 비트로 변환됩니다. 따라서 그러한 주소에 액세스 할 수있는 방법은 없습니다.

관련 문제