Tôi đang cố chuyển sang chế độ được bảo vệ trong x86 intel."gọi" sau khi chuyển sang Chế độ được bảo vệ
Tôi đã nạp GDT của tôi với lgdt, đặt cờ P của cr0 đến 1 và tất cả các phân đoạn selectors nhưng khi tôi trở về từ cuộc gọi chức năng, tôi không thể gọi bất kỳ chức năng khác hoặc tôi nhận được lỗi này
qemu: fatal: Trying to execute code outside RAM or ROM at 0xfeeb7c5b
đây là chức năng của tôi 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
Và các cuộc gọi của tôi
_start:
call switch_to_pmode
call foo // <----- Ouch!
Thank bạn
Cảm ơn bạn! Các .code32 hoạt động! – marmottus