私の英語が下手ですみません。
保護モードでは、アウト オブ セグメント リミットが #GP をトリガーします。しかし、64 ビット プロセッサ (I7-3840、i5-3540) では奇妙な問題があります。リアル モードで DS または ES を 0 に初期化し、保護モードに切り替えても、ロードされたリアル モードのディスクリプタ キャッシュ値を使用します:(DS_base_address = 0, limit = 0xFFFF.) このとき、DS や ES で 0xFFFF を超えるメモリにアクセスしても #GP は発生しません。
コードスニペット
.code16
start.1:
cli
xor cx,cx #
mov ds,cx
mov es,cx
mov ss,cx
mov sp,0x7c00
main:
lgdt gdtr
lidt idtr
mov eax,cr0
or al,1
mov cr0,eax
jmp $+2 #CS_BASE=DS_BASE=ES_BASE=0
#CS_SEL=DS_SEL=ES_SEL=0
#LIMIT = 0xFFFF
#
mov edi,0x40000 #DS ES 16bit segment ,exceeding the segment limit
mov [edi],eax #i386 will trigger #GP
jmp $