BIOS在保护模式下中断

时间:2014-10-19 07:46:25

标签: interrupt bios osdev protected-mode syslinux

我正在开发一个操作系统项目,使用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”

2 个答案:

答案 0 :(得分:4)

BIOS专为16位计算机而设计。但是,您仍有三个选项可以在受保护模式下调用BIOS中断。

  1. 切换回实模式并重新进入保护模式(最简单的方法)。
  2. 使用v86模式(在64位长模式下不可用)。
  3. 编写您自己的16位x86处理器仿真器(最难的方法)。
  4. 我在操作系统中使用了第一种方法来通过BIOS进行VBE和磁盘访问 在我的操作系统中用于此目的的代码:

    ;______________________________________________________________________________________________________
    ;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
    

答案 1 :(得分:3)

简短的回答是。 BIOS调用旨在以实模式运行,并且不受保护模式设置的限制,因此您不允许使用它们,如果您尝试,CPU将会出现三重故障。

但是,x86处理器提供Virtual 8086 mode,可用于模拟以16位实模式运行的x86处理器。 OSDev wiki和论坛提供了有关此主题的大量信息。如果你采用这种方法,通常最好将内核映射到较高的一半(Linux使用0xC0000000)以避免干扰VM86代码。