2011 04/03
Longモードへの移行
エミュレータはqemu-system-x86_64で。普通のqemuで実行すると、64bitのコードをきちんと実行できないかもしれません。
ロングモードではプロテクトモードでは必須でなかったページングが必要となり、
移行する前にこの様にページテーブルを作っておかないといけません。
cld mov si, 0xd100 ;このアドレスは適当 ;レベル4・ページマップ・テーブルを設定 mov di, 0xd000 mov ax, 0xe00f ;Present, Writable, User ; mov [edi], eax と同じ mov [si], ax mov cx, 4 rep movsb ;ページディレクトリ・ポインタ・テーブルを設定 mov di, 0xe000 mov ax, 0xf00f ;Present, Writable, User mov [di], ax ; mov [edi], eax と同じ mov [si], ax mov cx, 4 rep movsb ;ページディレクトリを設定 setPTE: mov di, 0xf000 mov ax, 0x018f ;Present, Writable, User, Page size:2MB mov [di], ax ; mov [edi], eax と同じ mov [si], ax mov cx, 4 rep movsb
次にPAEとPGEを有効化。
mov eax, cr4 or eax, 0xa0 mov cr4, eax
CR3にレベル4・ページマップ・テーブルのアドレスを指定
mov eax, 0xd000 mov cr3, eax
その次にロングモードを有効化。ここはよくわかんないです…。
mov ecx, 0xc0000080 rdmsr or eax, 0x0100 wrmsr
プロテクトモードに入る。とはいってもすぐにLongモードに移行します。
mov eax, cr0 or eax, 0x80000001 mov cr0, eax ;GDTを読み込む loadGDT: lgdt [GDTR] ;0x8200に飛ぶ jmp dword 8:0x8200 align 8 GDTR: dw GDT_END - GDT - 1 dq GDT+0x8000 align 8 GDT: ;NULLディスクリプタ dw 0 dw 0 db 0 db 0 db 0 db 0 ;コードディスクリプタ dw 0 dw 0 db 0 db 0x98 db 0x20 db 0 ;データディスクリプタ dw 0 dw 0 db 0 db 0x90 db 0 db 0 GDT_END:
0x8200からはLongモードになってます。
[bits 64] [org 0] ;なんか寂しいから一文字表示 mov edi, 0xb8000 mov byte [edi], 0x41 mov edi, 0xb8001 mov byte [edi], 0x41 mov rax, 0x123456789abcdef hlt: hlt jmp hlt
そしてRAXの中身を見てみると、0x123456789abcdefになってるはずです。
トラックバック - http://d.hatena.ne.jp/Mafice/20110403/1301811262
リンク元
- 6 http://www.google.co.jp/imglanding?q=ubuntu+ウィジェット&um=1&hl=ja&sa=N&tbm=isch&tbnid=2eTnbuk6tixgnM:&imgrefurl=http://d.hatena.ne.jp/Mafice/20110226/1298706858&imgurl=http://cdn-ak.f.st-hatena.com/images/fotoli
- 4 http://www.google.co.jp/search?q=npviewer.bin&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 4 http://www.google.com/search?client=ubuntu&channel=fs&q=npviewer&ie=utf-8&oe=utf-8
- 3 http://www.google.co.jp/url?sa=t&source=web&cd=2&ved=0CCUQFjAB&url=http://d.hatena.ne.jp/Mafice/20110124/1295872961&rct=j&q=npviewer.bin &ei=ivCfTbK8A4fuuAPz1OiMBQ&usg=AFQjCNGTnmtU8CiyFj3bnXloVXvrnrDNGA
- 2 http://www.google.co.jp/m?id=b6bd4736453fc0e5c8e19d0df9fba1e2&ie=Shift_JIS&q=グッピー+子供
- 2 http://www.google.co.jp/search?hl=ja&client=firefox-a&hs=C3e&rls=org.mozilla:ja:official&sa=X&ei=ilukTZbJC4SavgOYoviZCg&ved=0CCkQBSgA&q=npviewer.bin&spell=1
- 2 http://www.google.co.jp/search?q=PersonalForge&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja-JP-mac:official&hl=ja&client=firefox-a
- 2 http://www.google.co.jp/search?q=cannot+find+entry+symbol+_start&rls=com.microsoft:ja:IE-SearchBox&ie=UTF-8&oe=UTF-8&sourceid=ie7&rlz=1I7ADRA_ja&redir_esc=&ei=UWaaTa_FNISycfbw5NUF
- 2 http://www.google.co.jp/search?q=npviewer.bin&rls=com.microsoft:ja:IE-SearchBox&ie=UTF-8&oe=UTF-8&sourceid=ie7&rlz=1I7ADBR&redir_esc=&ei=-26eTZOgB4aOvQOp0JyJBQ
- 2 http://www.google.co.jp/search?q=ubuntu+デュアルディスプレイ+設定&hl=ja&lr=lang_ja&tbs=lr:lang_1ja,qdr:y&prmd=ivns&ei=kIWaTdD1HozUvQOajP3qBg&start=10&sa=N