X86 메모리 모델
X86 memory models인텔 메모리 모델은 컴퓨팅에서 세그먼트 레지스터의 사용 방법과 포인터의 기본 크기를 제어하는 리얼 모드로 동작하는 x86 CPU의 6가지 다른 메모리 모델을 말합니다.
메모리 세그멘테이션
4개의 레지스터는 16비트 x86 세그먼트메모리 아키텍처의 4개의 세그먼트를 참조하기 위해 사용됩니다.DS(데이터 세그먼트), CS(코드 세그먼트), SS(스택 세그먼트), ES(엑스트라 세그먼트).다른 16비트 레지스터는 특정 세그먼트에 대한 오프셋으로 기능할 수 있으므로 이 플랫폼의 논리 주소는 segment:offset(일반적으로 16진수 표기)으로 쓰여집니다.리얼 모드에서는, 메모리의 1 바이트의 물리 주소를 계산하기 위해서, 하드웨어는, 적절한 세그먼트 레지스터의 내용을 4비트 남겨진 채로 시프트 해(실효적으로 16을 곱한 후) 오프셋을 가산한다.
예를 들어, 논리 주소 7522는 다음과 같습니다.F139는 20비트의 물리 주소를 생성합니다.
75220 | |
+ | F139 |
84359 |
이 프로세스는 메모리의 에일리어스로 이어지기 때문에 물리 주소에 대응하는 논리 주소는 최대 4096개입니다.이로 인해 여러 세그먼트에 대한 포인터의 비교가 복잡해집니다.
포인터 크기
포인터 형식은 근접, 원거리 또는 거대로 알려져 있습니다.
- 근접 포인터는 기준 세그먼트 내의 16비트 오프셋입니다. 즉, 데이터의 경우 DS, 코드의 경우 CS입니다.이러한 포인터는 가장 빠른 포인터이지만 64KB의 메모리(데이터 타입의 관련 세그먼트)로 제한됩니다.근접 포인터는 레지스터(일반적으로 SI 및 DI)에 보유할 수 있습니다.
움직이다 bx, 단어 [조정하다] 움직이다 도끼, 단어 [bx] 움직이다 dx, 단어 [bx+2]
- 원점 포인터는 세그먼트와 오프셋을 포함하는 32비트 포인터입니다.세그먼트 레지스터 ES를 사용하려면 다음 지침을 사용합니다.
les [reg] [mem],dword [mem] [reg]
최대 1024KiB의 메모리를 참조할 수 있습니다.[1]포인터 산술(더하기 및 빼기)은 포인터의 세그먼트 부분을 수정하지 않고 오프셋만 수정합니다.0 또는 65535(0xFFF)의 한계를 넘는 동작은 일반 16비트 동작과 마찬가지로 모듈로 64K 동작을 수행합니다.예를 들어 세그먼트 레지스터가 0x5000으로 설정되고 오프셋이 증가하고 있는 경우 이 카운터 오프셋이 (0x10000)가 되는 순간 결과 절대 주소가 0x5000:0000으로 롤오버됩니다.
레스 bx,워드 [조정하다] 움직이다 도끼,단어 [es:bx] 움직이다 dx,단어 [es:bx+2]
- 큰 포인터는 본질적으로 원거리 포인터이지만, (대부분은) 그 주소에 대해 가능한 한 가장 높은 세그먼트를 가지도록 수정될 때마다 정규화됩니다.이는 매우 느리지만 포인터가 여러 세그먼트를 가리킬 수 있으며 플랫폼이 플랫 메모리 모델인 것처럼 정확한 포인터 비교가 가능합니다.상기와 같이 메모리의 에일리어스를 금지하기 때문에, 같은 메모리 로케이션을 참조하는 2개의 큰 포인터는 항상 같습니다.
레스 bx,워드 [조정하다] 움직이다 도끼,단어 [es:bx] 더하다 bx,2 시험 bx,0xfff0 jz lbl 후보선수 bx,0x10 움직이다 dx,es 주식회사 dx 움직이다 es,dx lbl: 움직이다 dx,단어 [es:bx]
메모리 모델
메모리 모델은 다음과 같습니다.
모델 | 데이터. | 코드 | 정의. |
---|---|---|---|
작음* | 근처에 | CS=DS=SS | |
작은. | 근처** | 근처에 | DS=SS |
중간의 | 근처** | 멀리. | DS=SS, 여러 코드 세그먼트 |
작은 | 멀리. | 근처에 | 단일 코드 세그먼트, 다중 데이터 세그먼트 |
큰. | 멀리. | 멀리. | 다중 코드 및 데이터 세그먼트 |
커다란 | 커다란 | 멀리. | 복수의 코드 세그먼트와 데이터 세그먼트(단일 어레이는 64KB 이상) |
- * Tiny 모델에서는 4개의 세그먼트 레지스터가 모두 같은 세그먼트를 가리킵니다.
- ** 근접 데이터 포인터가 있는 모든 모델에서 SS는 DS와 같습니다.
- *** 스택은 항상 최대 64KByte로 제한됩니다.
기타 플랫폼
보호 모드에서는 세그먼트를 쓰기 가능과 실행 [2][3]가능 둘 다 사용할 수 없습니다.따라서 Tiny 메모리 모델을 구현할 때 코드 세그먼트 레지스터는 동일한 물리적 주소를 가리키고 데이터 세그먼트 레지스터와 동일한 제한을 가져야 합니다.이로 인해 80286의 기능 중 하나가 무효화되었습니다.즉, 데이터 세그먼트(segment)는 실행 가능한 일이 없고, 코드 세그먼트(segment)는 기입할 수 없습니다(즉, 코드를 스스로 변경할 수 없습니다).다만, 80386에서는, 페이지 메모리 관리 유닛에 의해, 개개의 메모리 페이지를 [4][5]기입으로부터 보호할 수 있습니다.
메모리 모델은 16비트 프로그램에 한정되지 않습니다.32비트 보호 모드에서도 세그멘테이션을 사용할 수 있으며([6]그 결과 48비트 포인터가 생성됨), 이를 지원하는 C 언어 컴파일러가 존재합니다.다만, 32비트 모드의 세그먼트화에서는, 일부의 세그먼트가 항상 메모리에 존재하는 것은 아니고, 보다 큰 세그먼트 가상 [citation needed]공간상의 캐시로서 사용되는 경우를 제외하고, 단일 세그먼트보다 큰 주소 공간에 액세스 할 수 없습니다.이 기능을 사용하면 다양한 오브젝트에 대한 접근 보호가 향상됩니다(최대 1MB의 길이는 단일 페이징에 의해 제공되는 대략적인4 KiB의 세밀도와 비교하여 1바이트의 접근 보호의 세밀도를 얻을 수 있습니다).따라서 통신 소프트웨어 [citation needed]등의 특수한 어플리케이션에서만 사용됩니다.엄밀히 말하면, 「플랫」32비트 주소 공간은, 세그먼트 주소 공간의 「타이니」메모리 모델입니다.두 가지 경우 모두 4개의 세그먼트 레지스터에 1개의 동일한 값이 포함됩니다.
x86-64
x86-64 플랫폼에는 총 7개의 메모리 모델이 있습니다.[7]심볼 참조의 대부분은 32비트 폭에 불과하며 링크 시에 주소가 알려진 경우(위치에 의존하지 않는 코드와는 반대)입니다.이는 항상 플랫 64비트 포인터인 사용되는 포인터에는 영향을 주지 않지만 기호를 통해 액세스해야 하는 값만 배치할 수 있습니다.
「 」를 참조해 주세요.
참고 문헌
- Turbo C++ 버전 3.0 사용자 가이드볼랜드 인터내셔널, 저작권 1992년
레퍼런스
- ^ "Intel Instruction Set - LES". Intel Instruction Set pages. Istanbul Teknik Üniversitesi/Intel. Retrieved October 19, 2015.
- ^ "Intel 64 and IA-32 Architectures Developer's Manual: Vol. 3A". Intel. pp. 3–17. Retrieved September 13, 2011.
- ^ "AMD64 Architecture Programmer's Manual Volume 2: System Programming" (PDF). AMD. pp. 82–84. Retrieved September 13, 2011.
- ^ "Intel 64 and IA-32 Architectures Developer's Manual: Vol. 3A". Intel. pp. 4–41. Retrieved September 13, 2011.
- ^ "AMD64 Architecture Programmer's Manual Volume 2: System Programming" (PDF). AMD. p. 139. Retrieved September 13, 2011.
- ^ "Open Watcom C Language Reference version 2" (PDF). github.com/open-watcom. Open Watcom. Retrieved January 10, 2018.
- ^ "System V Application binary Interface, AMD64 Architecture Processor Supplement, Draft Version 0.99.7" (PDF). pp. 33–35.
{{cite web}}
: CS1 maint :url-status (링크)