Путаница селекторов NULL в 64-битных процессорах - PullRequest
2 голосов
/ 07 марта 2020

Я сожалею, что мой Engli sh не подходит.

В режиме защиты, предел вне сегмента вызовет #GP. Но у меня есть странная проблема на 64-битном процессоре (I7-3840, i5-3540): инициализировать DS или ES в 0 в реальном режиме, затем переключиться в режим защиты и все еще использовать значение кэша загруженного дескриптора реального режима: (DS_base_address) = 0, предел = 0xFFFF.) В настоящее время, если я получу доступ к памяти через 0xFFFF через DS или ES, он не будет вызывать # 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 $
...