プロテクトモード移行するには思いつく限り(以下間違えて認識しているところがありましたら教えてください。)
direction
1・セグメントディスクリプタ(とりあえず1個でも作ればアクセスできるはず) 2・IDT (これがないとソフトウエア割り込みを呼び出せない) 3・IR0レジスタのPEビットを1にセットする。 4・レジスタの値をセグメントベースからセレクタへ書き換える。(ここで先読みの問題が出てくる。)
この中の4つ目に関して不明点があるので教えてください。
今回の内容と非常に似た質問 ・・・ほぼ同じ
IR0のビットを1にセットした時点でメモリ空間へのアクセス方法
リアルモードでのセグメント方式のアクセス方法
セグメントベース × 10 + オフセット
ではなく
セグメントセレクタ(ディスクリプタからベースアドレス参照) + オフセット
このアクセス方法に変化する。
つまり、CR0レジスタのPEビットを1にしたあとも
リアルモードで使っていたCS,DSの値をそのまま使っていると
おそらく対応セグメントディスクリプタが見つからずエラーになる。
なので、・・・
プロテクトモード用にCS,DSを再セットする。
s
1MOV CS, 0xXX 2MOV DS, 0xXX
このようにしてDS,CDともに再セットしたかったところだがCPUは命令を先読するため、
CR0レジスタのPEビットをONにした時点で
CPUはリアルモード値がセットされたCS,DSが使われた命令群をすでに読み込んでしまっていることになる。
ここから本題 どうやってそれを解消するのか
s
1jmp $+2
この命令を使う。
このjmp命令を使うとCPUが先読みしていた命令群をクリアできる。
s
1;/_/_/_/_/_/_/_/ 2;CR0レジスタPEオン 3;/_/_/_/_/_/_/_/ 4mov eax, cr0 5or eax, 0x00000001 6mov cr0, eax 7 8 9;/_/_/_/_/_/_/_/ 10;先読みクリア 11;/_/_/_/_/_/_/_/ 12jmp $+2
!ここから勘違いが発生してる可能性があります!
間違えてたらお願いします。
CR0レジスタのPEビットを1にした時点で
プロテクトモード用のアクセスに切り替わるが
その時点ですでにCPUに先に読み込まれていた命令群は
プロテクトモードではなくリアルモードで動くのですよね?
似た質問
なので
s
1;/_/_/_/_/_/_/_/ 2;CR0レジスタPEオン 3;/_/_/_/_/_/_/_/ 4mov eax, cr0 5or eax, 0x00000001 6mov cr0, eax 7 8 9;/_/_/_/_/_/_/_/ 10;先読みクリア 11;/_/_/_/_/_/_/_/ 12jmp $+2 13nop 14nop 15 16jmp [セレクタ:32bitオフセット] ;← 17
リンク先の質問者さんは明示的に32bitで指定するための専用の命令が必要だといっておりますが
jmp $ + 2
で先読みをクリアしたあとならその命令というのは必要ありませんよね?
仮に、32bitオフセットができないとしても
mov cs,0xXX
でセレクタを指定することはできますよね?(命令が増えるけど)
0から作るOS
こちらでは
・先読みのクリア
・レジスタ再セット
をいっぺんにやっているように見えますが
s
1 MOV EAX, CR0 ; CR0レジスタの値を読み出します 2 OR EAX, 0x00000001 ; PEビットをOR命令でONします 3 MOV CR0, EAX ; そのままCR0に書き込みます 4 JMP CODE_DESC:Pmode_start ; CODE_DESCは0x08が入っています 5
このさいに32bitと認識されるための(?)専用命令を使っていますが
これはさきほどのように
CR0レジスタのPEビットを1にセットしたあとでも
その時点で先読みしていた命令群はリアルモード前提で実行され、16ビットレジスタを使えないから
という解釈であっていますか?
気になったのでお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/24 13:44 編集
2020/01/24 14:58
2020/01/24 15:40
2020/01/25 05:15
2020/01/26 12:51
2020/01/26 12:58
2020/01/26 13:12
2020/01/27 05:16
2020/01/27 07:28
2020/01/27 07:47 編集
2020/01/27 08:52
2020/01/28 07:32 編集
2020/02/06 09:15