4

x64 アーキテクチャでのリアル モードとプロテクト モードの違いは何ですか? Linux カーネル用のカスタム ブートローダーを作成しようとしています。アセンブリでプロテクト モードを有効にするにはどうすればよいですか?

4

1 に答える 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 に答える