プロテクトモードへの移行をしたいんですが、仮想OSが重大エラーが起きて、上手くできないんです。まだ初めてばかりですので、どうかよろしくお願いします。
追記****
A20以上有効とプロテクトモード有効をBIOSサービス割り込みのシステムサービスでやっても、重大エラーが起きたので、もしかしたらGDTの内容が間違っている部分があるかもしれません。よろしければGDTの解説もお願いします。
【変更したソースの一部】
前
Assembly
1 CALL Enable_A20;A20以上有効 2 3 MOV EAX, CR0; CR0レジスタの値を読み出します 4 OR EAX, 1; PEビットをOR命令でONします 5 MOV CR0, EAX; そのままCR0に書き込みます 6 JMP CODE_DESC:OS32 7------------------------------------------------------------------------------------------------- 8Enable_A20: 9 CLI; 割り込み禁止 10 11 CALL A20wait; ウェイト処理 12 MOV AL, 0xAD; キーボード無効化 13 OUT 0x64, AL 14 15 CALL A20wait; ウェイト処理 16 MOV AL, 0xD0; リードアウトプットポートコマンド送信 17 OUT 0x64, AL 18 19 CALL A20wait2; アウトプットポートの値が書き込まれるまでウェイト 20 IN AL, 0x60; リードバッファレジスタ読み込み 21 PUSH EAX; 読み込んだデータをスタックに保存 22 23 CALL A20wait; ウェイト処理 24 MOV AL, 0xD1; ライトアウトプットポートコマンド送信 25 OUT 0x64, AL 26 27 CALL A20wait; ウェイト処理 28 POP EAX; 読み込んだアウトプットポートの値を元に戻す 29 OR AL, 0x2; A20有効ビットを1にする 30 OUT 0x60, AL; A20有効にする出力データを送信 31 32 CALL A20wait; ウェイト処理 33 MOV AL, 0xAE; キーボード有効 34 OUT 0x64, AL 35 36 CALL A20wait; ウェイト処理 37 38 STI; 割り込み有効 39 RET 40A20wait:; ウェイト処理関数 41 IN AL, 0x64; ステータスレジスタ読み込み 42 TEST AL, 0x2; 送信したコマンド処理が完了をチェック 43 JNZ A20wait; 完了していない場合はループ 44 RET 45A20wait2:; アウトプットポートの値が書き込まれるまでウェイト処理関数 46 IN AL, 0x64; ステータスレジスタ読み込み 47 TEST AL, 0x1; 値が書き込まれたかインプットバッファフルをチェック 48 JZ A20wait2; 書き込まれていない場合はループ 49 RET 50
今
Assembly
1 MOV AX, 0x2401;A20以上有効 2 INT 0x15 3 4 MOV AH, 0x89;プロテクトモード有効 5 PUSH CODE_DESC 6 POP ES 7 MOV SI, OS32 8 INT 0x15
【仮想OSソフトウェア】
Oracle VM VirtualBox
VMware
【コンパイラ】
nasm
【現状】
初期化済み
カーネルロード済み
さらに初期化済み
VESAモード設定済み
GDT設定済み
A20以上有効済み
CR0でプロテクトモード有効・・・重大エラー発生
↓を追記して、コンパイルし、仮想OS起動すると重大エラーが起きました
Assembly
1 MOV EAX, CR0; CR0レジスタの値を読み出します 2 OR EAX, 1; PEビットをOR命令でONします 3 MOV CR0, EAX; そのままCR0に書き込みます 4 JMP CODE_DESC:OS32
【一部ソース】
Assembly
1CODE_DESC EQU 0x08 2DATA_DESC EQU 0x10 3 4[BITS 16] 5 6ORG 0xC200 7 8JMP OS 9 10%include "SetVESAmode.inc" 11 12OS: 13 ;初期化 14 XOR AX, AX 15 XOR BX, BX 16 XOR CX, CX 17 XOR DX, DX 18 MOV DS, AX 19 MOV ES, AX 20 MOV AX, 0x9000 ; スタックポインタを0x0009FFFCに設定する 21 MOV SS, AX 22 MOV SP, 0xFFFC 23 24 ;ビデオモード自動設定 25 CALL SET_VIDEO_VESA 26 JNC .set_video_vesa_OK 27 JMP fin 28 29 .set_video_vesa_OK: 30 31 CALL _setup_gdt;GDT設定 32 CALL Enable_A20;A20以上有効 33 34 MOV EAX, CR0; CR0レジスタの値を読み出します 35 OR EAX, 1; PEビットをOR命令でONします 36 MOV CR0, EAX; そのままCR0に書き込みます 37 JMP CODE_DESC:OS32 38 39 JMP fin 40 41_setup_gdt: 42 CLI 43 PUSHA 44 LGDT [gdt_OS32] 45 STI 46 POPA 47 RET 48 49Enable_A20: 50 CLI; 割り込み禁止 51 52 CALL A20wait; ウェイト処理 53 MOV AL, 0xAD; キーボード無効化 54 OUT 0x64, AL 55 56 CALL A20wait; ウェイト処理 57 MOV AL, 0xD0; リードアウトプットポートコマンド送信 58 OUT 0x64, AL 59 60 CALL A20wait2; アウトプットポートの値が書き込まれるまでウェイト 61 IN AL, 0x60; リードバッファレジスタ読み込み 62 PUSH EAX; 読み込んだデータをスタックに保存 63 64 CALL A20wait; ウェイト処理 65 MOV AL, 0xD1; ライトアウトプットポートコマンド送信 66 OUT 0x64, AL 67 68 CALL A20wait; ウェイト処理 69 POP EAX; 読み込んだアウトプットポートの値を元に戻す 70 OR AL, 0x2; A20有効ビットを1にする 71 OUT 0x60, AL; A20有効にする出力データを送信 72 73 CALL A20wait; ウェイト処理 74 MOV AL, 0xAE; キーボード有効 75 OUT 0x64, AL 76 77 CALL A20wait; ウェイト処理 78 79 STI; 割り込み有効 80 RET 81A20wait:; ウェイト処理関数 82 IN AL, 0x64; ステータスレジスタ読み込み 83 TEST AL, 0x2; 送信したコマンド処理が完了をチェック 84 JNZ A20wait; 完了していない場合はループ 85 RET 86A20wait2:; アウトプットポートの値が書き込まれるまでウェイト処理関数 87 IN AL, 0x64; ステータスレジスタ読み込み 88 TEST AL, 0x1; 値が書き込まれたかインプットバッファフルをチェック 89 JZ A20wait2; 書き込まれていない場合はループ 90 RET 91 92gdt_OS32: 93 DW 8*3 94 DD _gdt 95_gdt: 96 ;NULL 97 DW 0x0000 98 DW 0x0000 99 DW 0x0000 100 DW 0x0000 101 ;コード 102 DB 0xFF 103 DB 0xFF 104 DW 0x0000 105 DB 0x00 106 DB 0x9A 107 DB 0xCF 108 DB 0x00 109 ;データ 110 DB 0xFF 111 DB 0xFF 112 DW 0x0000 113 DB 0x00 114 DB 0x92 115 DB 0xCF 116 DB 0x00 117 118fin: 119 HLT 120 JMP fin 121 122[BITS 32] 123 124OS32: 125 ;初期化 126 MOV AX, DATA_DESC; DATA_DESCには0x10が入っています 127 MOV SS, AX; 以下データセグメントセレクタを入れています 128 MOV ES, AX 129 MOV FS, AX 130 MOV GS, AX 131 MOV DS, AX 132 133 MOV ESP, 0x90000; スタックポインタも初期化します 134 135fin32: 136 HLT 137 JMP fin32
回答1件
あなたの回答
tips
プレビュー