2014-10-19 16 views
6

Pracuję nad projektem systemu operacyjnego, używając isolinux (syslinux 4.5) jako bootloadera, ładując moje jądro nagłówkiem multiboot zorganizowanym na 0x200000.Przerywanie BIOSu w trybie chronionym

Wiem, że jądro jest już w trybie chronionym 32-bitowym. Moje pytanie: Czy jest jakiś łatwiejszy sposób na uzyskanie dostępu do przerwania systemu BIOS? (Zasadniczo chcę 0x10: D)

Po wczytaniu moje jądro ustawia własne wpisy GDT i IDT, a także kolejne przerwań IRQ. Czy możliwe jest przejście do trybu rzeczywistego zaraz po wczytaniu jądra i skonfigurowanie trybów VGA/SVGA (tryb VBE 2.0). Następnie, kiedy przejdę do mojego jądra i wskoczę do trybu chronionego, gdzie będę używać adresu fizycznego bufora VBE 2.0 do zapisu na ekranie? Jeśli tak, to w jaki sposób? Próbowałem wiele, ale nie dostać sukces :(

uwaga

Side. Szukałem dużo w internecie i okazało się, że syslinux 1.x + zapewnia _intcall API, nie jestem w 100% pewny o tym Patrz „syslinux 4,5 \ com32 \ lib \ sys \ initcall.c”

Odpowiedz

2

odpowiedź jest krótka nr. połączenia BIOS są przeznaczone do pracy w trybie rzeczywistym i nie przestrzegają ograniczeń określonych przez trybie chronionym, więc jesteś nie wolno ich używać, a procesor potwierdzi awarię, jeśli spróbujesz.

Jednak procesory x86 dostarczają Virtual 8086 mode, które mogą być używane do emulacji procesora x86 r działa w 16-bitowym trybie rzeczywistym. Wiki i fora OSDev dostarczają wielu informacji na ten temat. Jeśli wybierzesz tę trasę, dobrze jest zamapować jądro na wyższą połowę (Linux używa 0xC0000000), aby uniknąć ingerencji w kod VM86.

2

BIOS został zaprojektowany dla 16-bitowych maszyn. Jednak nadal masz trzy opcje wywoływania przerwań BIOS w trybie chronionym.

  1. Powrót do trybu rzeczywistego i powrót do trybu chronionego (Najłatwiejszy sposób).
  2. Użyj trybu v86 (niedostępne w trybie 64-bitowym).
  3. Napisz własny 16-bitowy emulator procesora x86 (najtrudniejsze podejście).

Użyłem pierwszego podejścia w moim systemie operacyjnym dla VBE i dostępu do dysku poprzez BIOS.
Kod używany w tym celu w moim systemie operacyjnym:

;______________________________________________________________________________________________________ 
;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 
Powiązane problemy