2011.08.14 14:24
     

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에 의해 보장된 방법이 아니므로, 이런 것도 가능하다는 팁 정도로 보시면 될 것 같네요. ^^;;;

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


그럼 좋은 하루 되세요 ;)
 

첨부 파일 :



Mittm

Android App

Posted by kkamagui

댓글을 달아 주세요

  1. Favicon of http://rodream.net BlogIcon rodream 2011.08.16 15:09  댓글주소  수정/삭제  댓글쓰기

    저기 qemu 는 hardware assisted vm 이 활성화된 qemu인가요? ㅇㅅㅇ?

    그렇지 않다면, 호환성 이슈가 다소 많아서, virtual box 나 vm ware가 더 좋은 것 같더라구요 ㅇㅅㅇ

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2011.08.18 02:50  댓글주소  수정/삭제

      QEMU는 하드웨어 가상화의 지원이 없이도 동작하는 에뮬레이터입니다. ^^

      하드웨어 가상화를 쓰는 VMware도 같이 사용하고 있긴 합니다만, 습관이 습관인지라 QEMU를 자꾸 쓰게 되네요. ㅠㅠ

      일단 Real Machine에서 실제로 동작하는 것을 확인했으니, 나중에 다른 Emulator도 동작을 확인해봐야겠군요. >ㅁ<)-b

      좋은 말씀 감사합니다.^^

  2. Favicon of http://nexusroi.co.cc/ BlogIcon 비스타 2011.08.18 17:14  댓글주소  수정/삭제  댓글쓰기

    흠.. MINT64OS는 Bochs나 VMWare나 QEMU 모두에서 동작하나보군요 ㅠ

    저는 QEMU에서는 되고 Bochs나 VMWare에선 안되는 기현상이 발생하더라구요.. 네이티브는 엄두도 못내고요.

    • Favicon of https://kkamagui.tistory.com BlogIcon kkamagui 2011.08.18 23:22 신고  댓글주소  수정/삭제

      앗? 그래요?

      비스타님도 OS를 만들고 계시나 보군요. ^^)-b

      이게 사실 가상 머신에 따라서도 되고 안되는 문제가 있긴 하더라구요.

      그래서 저는 QEMU하고 제 PC를 기준으로... 쿨럭..;;;

      호환성 맞추기가 제일 힘든 것 같아요 ;)

  3. 여니아빠 2011.08.25 17:19  댓글주소  수정/삭제  댓글쓰기

    혹시 위의 코드를 DOS용으로 코딩하여 실행을 시킬려면 어떤 부분을 수정해야 하나요?

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2011.08.29 18:25  댓글주소  수정/삭제

      안녕하세요, 여니아빠님 ^^

      만나서 반갑습니다. ^^

      위의 코드를 DOS용으로 코딩하여 실행을 하려면...
      코드를 빌드해서 나온 바이너리를 0x7C00에 복사한 뒤에, 0x7C00으로 Jump하여 실행하는 프로그램을 이용하면 될 것 같습니다. ^^

      이렇게하면 마치 부팅을 새로 시작하는 것과 같은 효과가 나거든요. ;)

      그럼 좋은 하루 되세요 ;)

  4. 여니아빠 2011.09.05 12:36  댓글주소  수정/삭제  댓글쓰기

    안녕하세요..블로그 코드 보면서 연습하고 있었는데
    드디어 오늘 책이 배송되어서..천천히 읽어보고 있습니다. 좋은 책 써주셔서 감사합니다. ^^

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2011.09.06 22:24  댓글주소  수정/삭제

      안녕하세요, 여니아빠님 ^^

      만나서 반갑습니다.

      책을 구매하셨다니... 제가 더 감사하지요. ^^

      다음 책(?)은 더 알찬 내용으로 찾아 뵙겠습니다.

  5. 여니아빠 2011.09.05 12:38  댓글주소  수정/삭제  댓글쓰기

    바이너리를 0x7c00에 복사한후 Jump를 하는건 문제가 없을것 같은데
    대신 DOS로 다시 복귀하기가 힘든것 같네요..DOS 환경을 모두 저장해뒀다가 복귀하던지 해야 겠어요

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2011.09.06 22:25  댓글주소  수정/삭제

      헛... 복귀까지 고려하고 계셨군요.

      그렇다면... 정말 어디다가 저장해놓고 실행해야겠군요. ㅠㅠ