Intel x86에서 보호 모드로 전환하려고합니다.보호 모드로 전환 한 후 "호출"
내가 lgdt 내 GDT를로드 한 1에 CR0의 P 플래그를 설정하고 난 함수 호출에서 돌아 왔을 때 모든 세그먼트 셀렉터는하지만, 내가 다른 함수를 호출 할 수 없거나 나는이 오류가
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!
감사 : 여기
qemu: fatal: Trying to execute code outside RAM or ROM at 0xfeeb7c5b
내 switch_to_pmode 기능입니다 당신
고마워요! .code32가 작동합니다! – marmottus