質問編集履歴
5
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,5 +1,75 @@
|
|
1
1
|
プロテクトモードへの移行をしたいんですが、仮想OSが重大エラーが起きて、上手くできないんです。まだ初めてばかりですので、どうかよろしくお願いします。
|
2
2
|
|
3
|
+
***追記*******
|
4
|
+
**A20以上有効とプロテクトモード有効をBIOSサービス割り込みのシステムサービスでやっても、重大エラーが起きたので、もしかしたらGDTの内容が間違っている部分があるかもしれません。よろしければGDTの解説もお願いします。**
|
5
|
+
|
6
|
+
**【変更したソースの一部】**
|
7
|
+
**前**
|
8
|
+
```Assembly
|
9
|
+
CALL Enable_A20;A20以上有効
|
10
|
+
|
11
|
+
MOV EAX, CR0; CR0レジスタの値を読み出します
|
12
|
+
OR EAX, 1; PEビットをOR命令でONします
|
13
|
+
MOV CR0, EAX; そのままCR0に書き込みます
|
14
|
+
JMP CODE_DESC:OS32
|
15
|
+
-------------------------------------------------------------------------------------------------
|
16
|
+
Enable_A20:
|
17
|
+
CLI; 割り込み禁止
|
18
|
+
|
19
|
+
CALL A20wait; ウェイト処理
|
20
|
+
MOV AL, 0xAD; キーボード無効化
|
21
|
+
OUT 0x64, AL
|
22
|
+
|
23
|
+
CALL A20wait; ウェイト処理
|
24
|
+
MOV AL, 0xD0; リードアウトプットポートコマンド送信
|
25
|
+
OUT 0x64, AL
|
26
|
+
|
27
|
+
CALL A20wait2; アウトプットポートの値が書き込まれるまでウェイト
|
28
|
+
IN AL, 0x60; リードバッファレジスタ読み込み
|
29
|
+
PUSH EAX; 読み込んだデータをスタックに保存
|
30
|
+
|
31
|
+
CALL A20wait; ウェイト処理
|
32
|
+
MOV AL, 0xD1; ライトアウトプットポートコマンド送信
|
33
|
+
OUT 0x64, AL
|
34
|
+
|
35
|
+
CALL A20wait; ウェイト処理
|
36
|
+
POP EAX; 読み込んだアウトプットポートの値を元に戻す
|
37
|
+
OR AL, 0x2; A20有効ビットを1にする
|
38
|
+
OUT 0x60, AL; A20有効にする出力データを送信
|
39
|
+
|
40
|
+
CALL A20wait; ウェイト処理
|
41
|
+
MOV AL, 0xAE; キーボード有効
|
42
|
+
OUT 0x64, AL
|
43
|
+
|
44
|
+
CALL A20wait; ウェイト処理
|
45
|
+
|
46
|
+
STI; 割り込み有効
|
47
|
+
RET
|
48
|
+
A20wait:; ウェイト処理関数
|
49
|
+
IN AL, 0x64; ステータスレジスタ読み込み
|
50
|
+
TEST AL, 0x2; 送信したコマンド処理が完了をチェック
|
51
|
+
JNZ A20wait; 完了していない場合はループ
|
52
|
+
RET
|
53
|
+
A20wait2:; アウトプットポートの値が書き込まれるまでウェイト処理関数
|
54
|
+
IN AL, 0x64; ステータスレジスタ読み込み
|
55
|
+
TEST AL, 0x1; 値が書き込まれたかインプットバッファフルをチェック
|
56
|
+
JZ A20wait2; 書き込まれていない場合はループ
|
57
|
+
RET
|
58
|
+
|
59
|
+
```
|
60
|
+
**今**
|
61
|
+
```Assembly
|
62
|
+
MOV AX, 0x2401;A20以上有効
|
63
|
+
INT 0x15
|
64
|
+
|
65
|
+
MOV AH, 0x89;プロテクトモード有効
|
66
|
+
PUSH CODE_DESC
|
67
|
+
POP ES
|
68
|
+
MOV SI, OS32
|
69
|
+
INT 0x15
|
70
|
+
```
|
71
|
+
|
72
|
+
|
3
73
|
【仮想OSソフトウェア】
|
4
74
|
Oracle VM VirtualBox
|
5
75
|
VMware
|
4
特になし
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|
3
仮想OSソフトウェアの内容追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
プロテクトモードへの移行をしたいんですが、仮想OSが重大エラーが起きて、上手くできないんです。まだ初めてばかりですので、どうかよろしくお願いします。
|
2
2
|
|
3
|
+
【仮想OSソフトウェア】
|
4
|
+
Oracle VM VirtualBox
|
5
|
+
VMware
|
6
|
+
|
3
7
|
【コンパイラ】
|
4
8
|
nasm
|
5
9
|
|
2
現状と一部ソースの訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -11,6 +11,13 @@
|
|
11
11
|
GDT設定済み
|
12
12
|
A20以上有効済み
|
13
13
|
CR0でプロテクトモード有効・・・重大エラー発生
|
14
|
+
↓を追記して、コンパイルし、仮想OS起動すると重大エラーが起きました
|
15
|
+
```Assembly
|
16
|
+
MOV EAX, CR0; CR0レジスタの値を読み出します
|
17
|
+
OR EAX, 1; PEビットをOR命令でONします
|
18
|
+
MOV CR0, EAX; そのままCR0に書き込みます
|
19
|
+
JMP CODE_DESC:OS32
|
20
|
+
```
|
14
21
|
|
15
22
|
【一部ソース】
|
16
23
|
```Assembly
|
@@ -148,21 +155,6 @@
|
|
148
155
|
|
149
156
|
MOV ESP, 0x90000; スタックポインタも初期化します
|
150
157
|
|
151
|
-
MOV EAX, 0x0000A000
|
152
|
-
MOV ES, EAX
|
153
|
-
MOV DI, 0
|
154
|
-
XOR EAX, EAX
|
155
|
-
MOV EAX, 15
|
156
|
-
.looper:
|
157
|
-
MOV DWORD [ES:DI], EAX
|
158
|
-
INC DI
|
159
|
-
|
160
|
-
CMP DI, 0xFFFF
|
161
|
-
JNE .looper
|
162
|
-
INC EAX
|
163
|
-
HLT
|
164
|
-
JMP .looper
|
165
|
-
|
166
158
|
fin32:
|
167
159
|
HLT
|
168
160
|
JMP fin32
|
1
タイトル訂正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
プロテクトモードへの移行
|
1
|
+
【アセンブリ言語】プロテクトモードへの移行
|
body
CHANGED
File without changes
|