x64 アーキテクチャでのリアル モードとプロテクト モードの違いは何ですか? Linux カーネル用のカスタム ブートローダーを作成しようとしています。アセンブリでプロテクト モードを有効にするにはどうすればよいですか?
1 に答える
2
osdevリアル モード、プロテクト モードを参照してください。
BIOS によって初期化された CPU は、リアル モードで起動します。保護モードを有効にすると、リアル モードではアクセスできない 4GB メモリをすべて使用できます。ただし、これらはリアル モードで動作するため (V86 モニターも作成していない限り)、ほとんどの BIOS 割り込みを使用できなくなります。
保護モードに切り替える前に、割り込みを無効にし、場合によっては A20 ラインを有効にし、コード、データ、およびスタックに適したセグメント記述子をグローバル記述子テーブルにロードする必要があります。
CPU がリアル モードかプロテクト モードかは、CR0 または MSW レジスタの最下位ビットによって定義されます。
この例では、記述子テーブルをプロセッサの GDTR レジスタにロードし、CR0 の最下位ビットを設定します。
cli ; disable interrupts
lgdt [gdtr] ; load GDT register with start address of Global Descriptor Table
mov eax, cr0
or al, 1 ; set PE (Protection Enable) bit in CR0 (Control Register 0)
mov cr0, eax
; Perform far jump to selector 08h (offset into GDT, pointing at a 32bit PM code segment descriptor)
; to load CS with proper PM32 descriptor)
JMP 08h:PModeMain
; [...]
PModeMain:
; load DS, ES, FS, GS, SS, ESP.
これにより、保護モードになります。
この後、C またはアセンブリでカーネル コードにジャンプできます。
于 2014-10-26T04:42:04.943 に答える