intel x86でプロテクトモードに切り替えることを試みています。プロテクトモードに切り替えた後に「コール」する
私は、lgdtと私のGDTをロード1にCR0のPフラグを設定し、すべてのセグメントセレクタが、私は、関数呼び出しから戻ったとき、私は他の関数を呼び出すことはできませんか、私はこのエラー
を取得しましたここで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!
感謝
ありがとうございました! .code32が機能します! – marmottus