«позвоните» после переключения в защищенный режим

Я пытаюсь переключиться на Защищенный режим в Intel x86.

Я загрузил свой gdt с помощью lgdt, установил для флага P cr0 значение 1 и все селекторы сегментов, но когда я возвращаюсь из вызова функции, я не могу вызвать любую другую функцию или получаю эту ошибку

qemu: fatal: Trying to execute code outside RAM or ROM at 0xfeeb7c5b

Вот моя функция switch_to_pmode:

gdtr:
.short      23  // limit
gdtr_base:
.long       0   // base

switch_to_pmode:
    movl $null_segment, %eax        // Address of the first byte of the GDT
    movl %eax, gdtr_base

    cli             // disable interrupts

    lgdt (gdtr)

    movl %cr0, %eax
    or $0x1, %eax
    movl %eax, %cr0         // Set the PE flag

    push $0x8
    push $reload_segments
    lret

reload_segments:
    movl $0x10, %eax
    movl %eax, %ds
    movl %eax, %ss
    movl %eax, %es
    movl %eax, %fs
    movl %eax, %gs

    ret

foo:
    ret

И мои звонки

_start:
    call switch_to_pmode
    call foo // <----- Ouch!

Спасибо

5
задан marmottus 6 February 2012 в 17:08
поделиться