2011-02-02 4 views

답변

3

16 비트 및 32 비트 x86 라인 (8086,8088, 80186, 80286, 80386, i486, Pentium 등)은 세그먼트/오프셋 주소 지정 방식을 사용합니다. 그러나 세그먼트가 정확히 무엇을 언급하는지는 8086/88/186 라인에서 80286 이후 라인으로 크게 변경되었습니다.

가상 주소 지정이없는 이전 칩에서는 오프셋이 16 비트 오프셋 인 반면 세그먼트는 20 비트 메모리 주소의 상위 16 비트를 참조했습니다. 즉, 매우 겹치는 64KB 블록 집합을 통해 1MB의 직접 주소 지정 메모리에 액세스했습니다.

나중에 "보호 모드"칩이 크게 전환했습니다. 이제는 세그먼트가 실제 주소의 상위 16 비트가 아니라 대신 기본 주소, 크기 제한, 보호 권한 등을 가리키는 메모리 구조를 포함하는 두 개의 조회 테이블 (GDT 또는 LDT) 중 하나에 대한 색인입니다. . 세그먼트의. 오프셋은 저장된 기본 주소에서 작동하며 크기 제한 기와 대조하여 외부의 메모리에 액세스하지 않도록 보장하므로 겹치는 주소가있는 경우이를 암시 적으로 겹쳐 쓰지 않고 명시 적으로 설정해야합니다 이전 칩 세트의 80286은 여전히 ​​64KB의 크기로 제한된 세그먼트를 가지고 있었지만 80386 이후에는 완전히 제거되었습니다.

세그먼트는 여전히 칩에 의해 암묵적으로 사용됩니다. 코드는 CS 세그먼트에서 가져옵니다 (별도로 명시하지 않는 한). DS 세그먼트에서 데이터를 가져옵니다 (달리 명시하지 않는 한 다시). ES는 많은 작업에서 대상으로 사용됩니다 (다시 ... 드릴을 안다면). 스택은 SS 등을 통해 액세스됩니다. 그러나 32 비트 프로세서 (80286 이후)의 많은 운영 체제 (모든 경우라도?)는 모든 세그먼트를 동일한 메모리 공간에 매핑하므로 플랫 주소 공간 레이아웃을 모방합니다. Windows NT 용 프로그램을 작성하거나 Linux 시스템 용 프로그램을 작성하는 경우 세그먼트에 대해 전혀 생각하지 않으려 고 할 가능성이 있습니다.

AMD64 지침은 다르지만 다시 기본적으로 세그먼트를 완전히 제거하는 단계입니다.일반적으로 그 환경에서 보호를 위해 사용되는 페이징 시스템입니다.

+0

8086에서 세그먼트 레지스터가 부족하여 사람들이 스케일 세그먼트 주소 지정을 싫어하게 만들었습니다. 4GB와 64GB 사이의 저장 공간을 필요로하는 객체 지향 응용 프로그램은 64 비트 선형 포인터를 사용하는 것보다 32 비트 확장 세그먼트와 32 비트 오프셋의 조합을 사용하여보다 효율적으로 처리 할 수 ​​있습니다 (모든 객체가 16 바이트 경계에 정렬 된 경우, 객체 참조는 8 개가 아니라 4 개가되어야합니다). 약간의 추가 하드웨어를 사용하면 "효율적인 주소 지정"범위를 1 테라 바이트 이상으로 확장 할 수 있습니다. – supercat

+0

실용적인 관점에서, 세그먼트 레지스터가없는 것을 제외하고는 문제는 (1) 세그먼트 아키텍처에서 최대 이점을 얻으려면 개체가 세그먼트 경계에서 시작해야합니다. 8086이 나왔을 때, 그러한 반올림으로 낭비되는 공간은 불쾌한 것으로 간주되었다. (2) 64K 이상의 개별 논리 오브젝트를 사용하기가 어려웠습니다. 오늘날 세계에서 객체를 16 바이트로 반올림해도 커다란 손실은 아니며 4GB보다 큰 객체를 세분화하는 것은 64K보다 큰 객체를 세분화하는 것만 큼 문제가되지 않습니다. – supercat

1

모든 32 비트 x86 컴퓨터는 세그먼트 레지스터의 전체 집합을 지원하고 메모리를 통해 메모리를 액세스합니다. amd64/Intel 64 칩은 여전히 ​​ 으로 제한되어 있지만 대부분의 분할 기능이 제거되었습니다.

보호 모드에서 실제 모드와 달리 세그먼트 레지스터는 이 단순히 크기 조정되고 주소에 추가되지 않습니다. 세그먼트의 사용 권한 비트뿐만 아니라 GWT 또는 LDT (글로벌 또는 로컬 설명자 테이블)에 대한 인덱스이며 세그먼트 설명자가 모두 포함되어 있습니다 (시작 주소와 크기는 ). 주소는 으로 제한보다 적게 검사되고 지정된 기본에 추가되고 은 사용 권한 비트와 비교하여 검사됩니다.

2

최대 32 비트 보호 모드까지 모든 주소 지정은 여전히 ​​세그먼트 레지스터를 사용하지만 거의 모든 32 비트 OS에서 네 개의 기본 세그먼트 레지스터는 기본 주소 0과 제한 4로 설정됩니다 기가 바이트이기 때문에 기본적으로 모두 통과 (pass-through)됩니다. 모든 주소 변환은 페이징 유닛을 통해 수행됩니다.

64 비트 모드에서는 (아무튼 사용하지 않는) 대부분의 다른 옵션은 단순히 제거됩니다. 세그먼트는 여전히 제한된 정도 (주로 64 비트 모드와 호환 모드 사이를 전환하는 데 사용됩니다)이지만 그 정도입니다.