2016-07-18 4 views
3

x86의 보호 모드 부분을 살펴 보겠습니다. 방금 GDT에 대해 배웠습니다. 전에 보호 모드 (예 : 모든 32 비트 주소 라인 사용)로 들어가기 위해 공부했습니다. A20 게이트가 활성화되어야합니다. 그래서 A20을 활성화하는 코드는 16 비트가되어야합니다. 최근에 wiki.osdev 사이트를 방문했을 때 A20을 활성화하는 코드가 x86 어셈블리로 작성된 것으로 나타났습니다. X86 어셈블리가 16 비트 모드로로드 할 수없는 32 비트 opcode를 생성합니까?A20 라인은 보호 모드에서 어떤 역할을합니까?

가능한 경우 설명하십시오. 감사합니다.

+0

16 비트 및 32 비트 x86 어셈블리가 모두 있습니다. 어느 모드에서든 x86 어셈블리를 어셈블 할 수 있습니다. – fuz

+0

생성되는 코드의 종류는 사용 된 실제 opcode 에서처럼 어셈블러 및 어셈블러 지시문 및 어셈블러 플래그에 따라 다릅니다. –

답변

10

8086 어드레싱 모델은 16 비트 세그먼트와 segment * 16 + offset으로 결합 된 16 비트 오프셋을 고려했다.
최소 주소는 000000h이며 최대 값은 10ffefh입니다. 후자는 기술적으로 21 비트 값이지만
는 CPU는 어드레스 버스의 20 비트를 가지고 때문에 액세스 큰 어드레스는 단순히 2 감싸 0fffffh 상기 0fffffh1

이런 주소이었다 그래서 10ffefh0ffefh의 별명입니다.
일부 프로그램은 그 프로그램에 의존하기 시작했습니다.

80286이 나왔을 때 주소 버스에는 24 비트가있었습니다.
10ffefh과 같은 주소가 더 이상 포함되지 않았습니다.
이전 동작을 에뮬레이션 할 때 너무 많은 트랜지스터가 필요했기 때문에 (10ffefh은 AND로 마스크 할 수 없음) A20 마스크가 도입되었습니다.

이름에서 알 수 있듯이 21 번째 비트 인 20 번째 주소는 8055/8042 칩의 특정 레지스터의 특정 비트와 AND 연산을 수행했습니다.
BIOS가 시작할 때 해당 비트를 지워서 21 비트를 0으로 강제 설정하여 이전 동작을 에뮬레이션합니다.

A20을 활성화하지 않으면 모든 실제 주소의 21 번째 비트가 항상 0입니다.


이에 "32 비트 모드"가장 가까운 일이 평평한 모델, 보호 모드에서 A20을 가능하게 할 수 있지만, 메모리에 코드를 배치에주의해야합니다.

x86 어셈블리는 어셈블러에 대상 크기를 알려주어 16 비트 또는 32 비트 코드를 생성하는 데 동등하게 사용할 수 있습니다. 에 의해 주어


1 예를 들어, 0f000h의 세그먼트는이 0ffffh 오프셋.
21 번째 비트는 단순히 버려졌습니다.
16 비트 또는 32 비트 코드를 작성하는 경우 간단히 입력하십시오.

+3

답변에 암시되어 있긴하지만 명확하게 말하면됩니다. A20 라인을 사용하지 않으면 홀수 메가 바이트 (1024k) 경계에서 시작하는 모든 메모리 영역이 바로 아래의 짝수 메가 바이트 영역에 매핑됩니다. 물론 부작용은 사용 가능한 실제 메모리 주소의 절반에 액세스 할 수 없다는 것입니다. –

+0

자세히 설명해 주시겠습니까 @ 마이클 페치? –

+2

@PantherCoder Michael은 범위 * 100000h * - * 1FFFFFh *가 * 000000h * - * 0FFFFFh *, 범위 * 300000h * - * 3FFFFFh *에서 * 200000h * - * 2FFFFFh *, 범위 * 500000h * - * 5FFFFFh * ~ * 400000h * - * 4FFFFFh * 등등. 범위 * 000000h * - * 0FFFFFh *, * 200000h * - * 2FFFFFh *, * 400000h * - * 4FFFFFh * 등은 영향을받지 않습니다. 이는 A20이 강제로 0으로 설정되어 주소 (32 비트 -> 31 비트)를 벗어나 주소 공간을 절반으로 남겨 둡니다. 임의의 32 비트를 가져 와서 비트 20을 마스크 할 때 어떤 일이 발생하는지 확인하십시오. –

-2

A20 게이트가 닫히면 20 번째 주소 비트가 0으로 설정됩니다. 예를 들어 주소 0x000100ab에 액세스하려는 경우 실제로 0x000000ab에 액세스하거나 0x06570021에 액세스하려는 경우 보호 모드 또는 실제 모드에 관계없이 실제로 0x0656021에 액세스합니다. 그 이유는 리얼 모드에서는 실제 주소를 생성 할 수 있기 때문에 예를 들어 0x001000ab와 같이 20 비트를 더 많이 사용하게됩니다. 세그먼트 : 효과적인 주소 조합 FFFF : 00bb,하지만 8086은 0x000ab까지 잘린 반면 A20 게이트가 열리면 80286 이상은 0x001000ab에 액세스 할 수 있습니다. 마녀는 일부 BIOS 코드와 같이 " 특색".

물론 보호 모드로 전환하면 보호 모드 마녀에서 20 비트 주소가 열리는 이유는 닫힌 A20 게이트가 완전히 혼란 스럽습니다.