리얼 모드 세그먼트 메모리 모델에서 세그먼트는 항상 단락 경계에서 시작됩니다. 단락은 16 바이트이므로 세그먼트 주소는 항상 16으로 나눌 수 있습니다. 단락 경계에서 세그먼트를 갖는 이유/이점은 무엇입니까?세그먼트가 단락 경계에서 시작하는 이유는 무엇입니까?
답변
8086의 리얼 모드 세분화 모델은 세그먼트 레벨 레지스터가 단락 경계를 지정하도록 하드웨어 수준에서 설계되었습니다.
세그먼트 레지스터가 8086의 20 비트 주소 공간의 상위 16 비트의 기본 주소를 지정하면 해당 기본 주소의 하위 4 비트는 본질적으로 0이됩니다.
세그먼트 아키텍처는 8086의 16 비트 레지스터 아키텍처에서 전체 메가 바이트 (!)의 주소 공간 (20 비트의 주소 지정 필요)을 처리 할 수있는 한 가지 방법이었습니다.
조금 더 많은 역사가 있긴하지만 Intel이 x86 아키텍처를 도입 한 다음 단계는 세그먼트 레지스터를 추상화하여 기본 주소를 직접 정의하는 것입니다. 그것은 286 보호 모드였습니다. 세그먼트 레지스터는 물리적 인 주소에 대한 정보를 보유한 디스크립터 테이블 집합에 대한 인덱스와 물리적 인 기본 주소에 대한 비트를 정의하는 대신에 물리적 인 기억, 그리고 다른 것들.
현대 32 비트 또는 그 이상의 x86 프로세서의 세그먼트 레지스터는 여전히 그렇게합니다. 그러나 선택기에 의해 정의 된 세그먼트 내에서 가상 메모리 의미를 제공 할 수있는 전체 32 비트 주소 지정 (x64 프로세서에서 64 비트) 및 페이지 테이블을 지정할 수있는 주소 오프셋을 사용하면 프로그래밍 모델은 기본적으로 응용 프로그램 수준에서 세그먼트 레지스터를 조작해야합니다. 대부분의 경우 OS는 세그먼트 레지스터를 한 번 설정하고 다른 것은 처리 할 필요가 없습니다. 따라서 프로그래머는 일반적으로 더 이상 존재하지 않는다고 할 필요조차 없습니다.
세그먼트가 일부 상황에서 다시 발생합니다. 리눅스에서 스레드 로컬 저장소 구현. 스레드 로컬 변수는 고정 오프셋을 통해 액세스하지만 커널이 각 스레드마다 다르게 설정하는 'gs' 세그먼트 레지스터를 사용합니다. 다시 컴파일러는 프로그래머를 괴롭히지 않고이를 처리합니다. –
8086에는 20 개의 주소 라인이 있습니다. 세그먼트는 맨 아래의 4 줄 또는 16 개의 주소의 오프셋을 남기고 상위 16 개에 매핑되었습니다.
세그먼트 레지스터는 해당 세그먼트가으로 시작하는 메모리 위치 의 주소를 저장합니다. 그러나 세그먼트 레지스터는 16 비트 정보를 저장합니다. 이 16 비트는 주소의 오른쪽 끝에 0의 4 비트를 추가하여 20 비트로 변환됩니다. 세그먼트 레지스터에 1000H가 포함되어 있으면 10000H가되도록 왼쪽으로 시프트됩니다. 이제는 20 비트입니다.
변환하는 동안 우리는 주소의 끝에 4 비트를 추가했습니다. 그래서 메모리의 모든 세그먼트는 마지막 4 비트는 메모리 위치 로 시작해야합니다 0 예를 들어
: 세그먼트가 10001H 메모리 위치에서 시작하는 경우
이, 우리는 마지막 4 있기 때문에 액세스 할 수 없습니다 비트는 0이 아닙니다. 세그먼트 레지스터의 모든 주소에는 오른쪽 끝에 4 비트가 추가되어 20 비트로 변환됩니다. 따라서 그러한 주소에 액세스 할 수있는 방법은 없습니다.
- 1. libc.so에는 프로세스에 4 개의 세그먼트가 매핑되어 있는데, 이유는 무엇입니까?
- 2. JVM이 항상 FULL GC로 시작하는 이유는 무엇입니까?
- 3. HTML 코딩에서 텍스트가 #_로 시작하는 이유는 무엇입니까?
- 4. 이런 식으로 전환 모드를 시작하는 이유는 무엇입니까?
- 5. PHP 변수가 $ 기호로 시작하는 이유는 무엇입니까?
- 6. ActualWidth 및 ActualHeight가 0,0에서 시작하는 이유는 무엇입니까?
- 7. Firefox의 경계에서 getImageData를 처리하는 방법은 무엇입니까?
- 8. URL 세그먼트가 적은 CodeIgniter
- 9. 문장 경계에서 텍스트 파일 분할
- 10. 서비스 경계에서 WCF 오류 로깅
- 11. TCP 세그먼트가 어떻게 분할 되었습니까?
- 12. 기본 창 경계에서 wpf 팝업을 자르십시오.
- 13. 단락 나누기
- 14. 하스켈의 단락 (&&)
- 15. 기능 단락
- 16. 단락 태그
- 17. 큰 SQL 파일을 문장 경계에서 분할 하시겠습니까?
- 18. Oracle 기능과의 단락 OR이 없습니까?
- 19. Android AVD가 시작하는 데 너무 오래 걸리는 이유는 무엇입니까?
- 20. 모든 브라우저의 사용자 에이전트가 "Mozilla /"로 시작하는 이유는 무엇입니까?
- 21. 숫자로 시작하는 ASP.NET MVC 컨트롤러의 이름이 바뀐 이유는 무엇입니까?
- 22. SQL Server의 테이블 이름이 "dbo"로 시작하는 이유는 무엇입니까?
- 23. 생성 된 일리노이 코드가 Nop으로 시작하는 이유는 무엇입니까?
- 24. FPS를 설정할 때 SDL로 타이머를 시작하는 이유는 무엇입니까?
- 25. Google 애널리틱스 추적 코드의 모든 메소드가 밑줄로 시작하는 이유는 무엇입니까?
- 26. 코드 세그먼트가 동일한 프로그램의 다른 인스턴스에 대해 공통적 인 이유
- 27. 지정된 경계에서 Google지도의 마커를 그릴 수있는 방법은 무엇입니까?
- 28. Python/Django의 단락 번역
- 29. 행 경계에서 테이블 오버플로를자를 수 있습니까?
- 30. 은 경계에서 매개 변수 값을 엄격하게 제한합니다.
숙제 태그가 필요합니까? –
"프로그래밍 질문이 아닙니다."가 필요합니다. –
음 ... 사실, 리눅스에서 단계별 어셈블리 언어로 작업하고 있는데 단락 경계에서 세그먼트를 유지하는 이유를 알 수 없습니다. – pug