Intel과 AMD에서는 IA-32e Mode, 즉 Long Mode로 전환할 때 Protected Mode(보호 모드)를 거치도록 되어있습니다. 아래 그림은 Intel Manual에서 가져온 Operating Modes Transition Diagram입니다. ^^
 


위의 그림에서 보면 Real Mode(이하 리얼 모드)에서 IA-32e Mode or Long Mode(이하 IA-32e Mode)로 전환할 때 바로 가는 화살표가 없고 Protected Mode(이하 보호 모드)를 거쳐서 IA-32e 모드로 가게 되어 있습니다. 

그.런.데 익명의 제보로 바로 가는 것이 가능하다는 것을 알게 되었습니다. 그래서 구글을 검색해보니 실제로 2005년도에 바로 갈수있는 방법을 찾아내신 분이 있더군요. ^^)-b

OSDev에서 발견했는데, http://forum.osdev.org/viewtopic.php?t=11093에서 그 내용을 보실 수 있습니다. 방법은 비교적 간단합니다. 보호 모드에서 하는 작업을 그대로 리얼 모드에서 한 뒤에 IA-32e 모드로 jump를 하는 것입니다. 아래는 OSDev 링크의 방법을 그대로 옮겨 놓은 것입니다. ^^;;;;

1) Build paging structures (PML4, PDPT, PD and PTs)

2) Enable PAE in CR4

3) Set CR3 so it points to the PML4

4) Enable long mode in the EFER MSR

5) Enable paging and protected mode at the same time (activate long mode)

6) Load a GDT

7) Do a "far jump" to some 64 bit code


때마침 여유가 좀 생겨서 실제로 가능한 예제 코드를 한번 만들어 봤습니다. 기본 뼈대로는 MINT64 OS의 부트 로더 코드와 보호 모드 코드를 사용했고, IA-32e 모드로 전환 가능한지 확인하는 것이 목적이었기 때문에 최소한의 코드만 작성했습니다. 

아래는 실제로 동작하는 화면을 캡쳐한 것입니다. QEMU를 사용해서 확인했습니다. ^^


<실제로 QEMU에서 구동한 화면>


리얼 모드에서 보호 모드를 거치지 않고 IA-32e 모드로 전환하는 방법은 Manual에 의해 보장된 방법이 아니므로, 이런 것도 가능하다는 팁 정도로 보시면 될 것 같네요. ^^;;;

그럼 아래에 실제 코드 나갑니다. ^^
(첨부 파일에 소스 코드와 컴파일된 바이너리도 같이 넣어두었으니 참고하시기 바랍니다)


그럼 좋은 하루 되세요 ;)
 

첨부 파일 :



+ Recent posts