8

isolinux (syslinux 4.5) をブートローダーとして使用し、0x200000 に編成されたマルチブート ヘッダーをカーネルにロードして、オペレーティング システム プロジェクトに取り組んでいます。

私が知っているように、カーネルはすでに 32 ビット保護モードになっています。私の質問: BIOS 割り込みにアクセスする簡単な方法はありますか? (基本的には 0x10 が欲しい:D)

ロード後、カーネルは独自の GDT および IDT エントリを設定し、さらに IRQ を再マップします。では、カーネルがロードされて VGA/SVGA モード (VBE 2.0 モード) が設定された直後にリアル モードにジャンプすることは可能ですか? 次に、カーネルを続行し、VBE 2.0 物理バッファー アドレスを使用して画面に書き込むプロテクト モードにジャンプしますか? はいの場合、どのように?いろいろ試しましたが、うまくいきませんでした:(

補足: インターネットでよく検索したところ、syslinux 1.x+ が _intcall API を提供していることがわかりました。100% 確信があるわけではありません。「syslinux 4.5\com32\lib\sys\initcall.c」を参照

4

2 に答える 2

7

BIOS は 16 ビット マシン用に設計されました。ただし、プロテクト モードで BIOS 割り込みを呼び出すオプションは 3 つあります。

  1. リアル モードに切り替えて、プロテクト モードに再度入ります (最も簡単な方法)。
  2. v86 モードを使用します (64 ビット long モードでは使用できません)。
  3. 独自の 16 ビット x86 プロセッサ エミュレータを作成します (最も困難な方法)。

私のオペレーティング システムでは、VBE と BIOS を介したディスク アクセスに最初のアプローチを使用しました。
私のオペレーティングシステムでこの目的に使用されるコード:

;______________________________________________________________________________________________________
;Switch to 16-bit real Mode
;IN/OUT:  nothing

go16:
    [BITS 32]

    cli         ;Clear interrupts
    pop edx         ;save return location in edx

    jmp 0x20:PM16       ;Load CS with selector 0x20

;For go to 16-bit real mode, first we have to go to 16-bit protected mode
    [BITS 16]
PM16:
    mov ax, 0x28        ;0x28 is 16-bit protected mode selector.
    mov ss, ax  
    mov ds, ax
    mov es, ax
    mov gs, ax
    mov fs, ax
    mov sp, 0x7c00+0x200    ;Stack hase base at 0x7c00+0x200    


    mov eax, cr0
    and eax, 0xfffffffe ;Clear protected enable bit in cr0

    mov cr0, eax    

    jmp 0x50:realMode   ;Load CS and IP


realMode:
;Load segment registers with 16-bit Values.
    mov ax, 0x50
    mov ds, ax
    mov fs, ax
    mov gs, ax
    mov ax, 0
    mov ss, ax
    mov ax, 0
    mov es, ax
    mov sp, 0x7c00+0x200    

    cli
    lidt[.idtR]     ;Load real mode interrupt vector table
    sti

    push 0x50       ;New CS
    push dx         ;New IP (saved in edx)
    retf            ;Load CS, IP and Start real mode

;Real mode interrupt vector table
.idtR:  dw 0xffff       ;Limit
    dd 0            ;Base
于 2014-10-27T12:47:34.880 に答える