对不起,我的英语不好。
在保护模式下,超出段限制将触发#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 $