2010-10-23 3 views
5

처음 8086 또는 8088의 전원이 켜지면 프로세서는 어떤 주소에서 실행을 시작합니까? 나는 Z80이 0에서 시작한다는 것을 알고 있으며, 6809는 FFFF에서 시작 주소를 찾는다. 그러나 나는 x86이 어떻게 시작하는지 궁금해했다.x86은 어떤 주소로 실행을 시작합니까?

편집 :

이것은 BIOS가 개입하지 않는다고 가정합니다. I.E. 부팅 할 수있는 자체 EEPROM이 있다면, RAM을 통해 머신을 실행하려면 어디에 위치해야합니까?

답변

9

이것은 실제로 실현 된 것보다 훨씬 복잡한 질문입니다. 8086에서는 꽤 간단합니다. FFFF : 0000 (메모리가 끝나기 전에 16 바이트)에서 시작됩니다.

까다로운 부분은 286 이상입니다 (즉, 현대적인 모든 것). 이 경우에도 메모리가 끝나기 전에 16 바이트가 계속 시작되지만 물론 24 비트 주소 지정 (286) 또는 32 비트 주소 지정 (386+)에서는 실제 주소가 다릅니다. 그것들은 복잡하지는 않지만 실제로는 그렇습니다. 복잡성은 프로세서가 리얼 모드에서 실행을 시작하지만 그 주소 (및 근처의 모든 주소)가 리얼 모드에서 프로세서에 표시되지 않기 때문에 발생합니다. 따라서 처음에는 실제 모드에서 대부분의 관점에서 다소 이상한 모드로 실행되지만 실행하려고하는 주소의 상위 비트 중 일부는 무시되고 기본적으로 1로 하드 연결되어 있으므로 실제 주소의 맨 위 공간이 프로세서에 표시됩니다. 그런 다음 멀리뛰기를 실행하면 프로세서가 자동으로 "일반"리얼 모드로 전환합니다.

BIOS는 리얼 모드에서 시작하지만 대개 (단시간) 보호 모드 환경을 설정하고 보호 모드로 전환하기 전에 짧은 시간 동안 그런 식으로 실행됩니다. 거기에서 BIOS는 일반적인 전원 공급 자체 테스트를 실행하고 BIOS의 압축을 풀어 이 실제로 인 FFFF : 0000에있는 RAM에 복사하고 리얼 모드로 다시 전환하고 애드온 주변 ROM에 코드를 실행합니다. 자동으로 실행하도록 표시됩니다 (일반적으로 프로세스에서 보호 모드로 다시 전환되지만 완료되면 실제 모드로 돌아갑니다). 그 중 하나는 일반적으로 디스크에서 부팅 블록을 자동으로 읽는 코드가있는 하드 디스크 컨트롤러이며, OS 등의로드를 시작하기 위해 실행합니다.

+0

자세한 설명을위한 보너스 포인트, 고마워요! –

-1

8086 reset은 프로그램 카운터를 FFFF0h로 설정합니다.

+0

BIOS 영역에 있습니다. 그런 다음 BIOS는 초기화를 수행하고 0x7C00으로 부트 섹터 (512 바이트)를 읽고 거기로 점프합니다. – ruslik

+0

@ruslik : 질문은 8086 아키텍처에 관한 것이지 IBM PC는 아닙니다. 따라서 BIOS는 이것과 아무런 상관이 없습니다. 결국 BIOS를 사용하지 않고 8086 주위에 머신을 만들 수 있습니다 (일반적으로 이해되는대로). – Schedler

0

cs 레지스터는 0xffff으로 설정되고 ip (명령 포인터)은 0x0000으로 설정됩니다.

이것은 실제 메모리 위치 0xffff0에 해당하지만 cs/ip의 내용은 멀리뛰기없이 사용할 수있는 메모리의 양과 위치 독립적이지 않은 경우 코드를 생성해야하는 방법에 영향을주기 때문에 중요합니다.

기본적으로 코드를 처리 할 수있는 64K 청크가있는 이전 8080 일과 같습니다. cs을 변경하면 모든 과정이 변경됩니다.

관련 문제