Blady przy wejsciu do trybu chronionego

Odpowiedz Nowy wątek
2007-01-08 21:40
Assesmaniac
0

Juz dosyc duzo sie naczytalem o trybie chronionym i innych rzeczach nalezacych do tego trybu ale caly czas mam pare luk w wiedzy :(

A mianowicie jak dziala obsluga stosu ? Tzn wyczytalem ze jest limit po ktorym stos jest przepisywany w inne miejsce jak sie skonczy, ale gdzie jest przechowywana wielkosc stosu i gdzie poinienem go zainicjalizowac? ss:esp to sa wspolzedne stosu no nie? Ale jak chce cos do nich zapisac to sie system wywala :( mozliwe ze cos w kodzie zle zrobilem z przejscia z trybu 16b do 32b.

Mam tez pytanko o dzialanie stronicowania pamieci a mianowicie jak najlepiej ustawic limit startu pamieci tzn to cos gdzie sie wisuje od jakiej komorki pamieci jest pamiec dostepna dla reszty programow, oraz ciekawi mnie tablica stron, przy pelnym rozmiarze 1024x1024x4kB to wychodzi 4MB, czy mozna np ustawiac ja tak zeby zawierala np tylko polowe tych wpisow by nie zasmiecala ramu?

Jak mam przerywanie to w jednym rejstrze mam zapisane skad przylazl program tzn segmend kodu, ale gdzie siedzi poziom uprzywielowania tego programu?

Z przerywaniami, planista i obsluga sprzetu powinienem sobie poradzic ale nie moge wyczajic dlaczego mi sie wiesza system jak mam wszystko od komentowane w kodzie po [BITS 32] (sama petla for dziala)

Moj system jest zaladowany pod 0x1000:0000 (tryb rzeczywisy) i nie wiem jak zmusic by po przejciu w tryb chroniony mogl wszystko ladnie robic, mozliwe ze cos przeoczylem ale chyba dam rade cos wreszczcie stworzyc :P

Ponizej kod mojego jajka:

;   Author: Pawel Jablonski
;   E-mail: [email protected]
;   All Rights Reserved

[BITS 16]

init_start:     mov [data_interface], ah ;interface type, 0x01 - floppy
                mov [data_inumber], al ;interface number, 0x00 - for floppy is disc A in windows
                mov [data_partition], bl ;partition, 0x00 - first partition
                jmp init_main

data_interface  db 0x00 ;main type of interface
data_inumber    db 0x00 ;main interface number
data_partition  db 0x00 ;main partition on main interface

data_scrh       dw 50 ;height of screen
data_scrw       dw 80 ;weight of screen

%include "init/print_16.inc" ;char printer
%include "init/logo_16.inc" ;data of logo and logo printer

init_main:      mov ax, 0x1000
                mov ds, ax
                mov es, ax
                ;mov ax,0x0003
                ;int 0x10 ;clear and set screen
                ;mov ax, 0x1112
                ;xor bl, bl
                ;int 0x10 ;8x8 fonts
                call init_cands ;clera screen and set size 80x50
                call init_printlogo ;print logo

init_a20:       in al,0x92 ;check a20
                test al,2
                jnz init_cli
                or al,2 ;set a20 bit
                out 0x92,al

init_cli:       cli

init_ds:        cld
                mov ax, 0x1000
                mov ds, ax
                mov es, ax
                jmp init_gdt

data_gdt        dd 0x00000000, 0x00000000 ;Null segment
                dd 0x0000FFFF, 0x00CF9A00 ;Code segment
                dd 0x0000FFFF, 0x00CF9200 ;Date segment

data_lgdt       dw 0x0000, 0x0000, 0x0000 ;6 byte for lgdt

init_gdt:       mov ax, data_gdt
                mov [data_lgdt + 2], ax ;set offset
                mov ax, 0x0001
                mov [data_lgdt + 4], ax ;add real offset to begin address space of code
                mov ax, data_lgdt - data_gdt - 1 ;gdt table size
                mov [data_lgdt], ax
                lgdt [data_gdt] ;set address of GDT
                push init_cr
                ret

init_cr:        mov eax, cr0
                or eax, 0x00000001
                mov cr0, eax ;protect mode start
                jmp init_pm

[BITS 32]

init_pm:        ;mov ax, 0x1000
                ;mov ss, ax ;stack address
                ;mov eax, ss
                ;mov ss, eax
                ;mov ds, ax
                ;xor eax,eax
                ;mov fs, ax
                ;mov es, ax
                ;mov gs, ax
                ;mov esp, 0x00070000    ;offset of stack

                ;mov ax, 0x0E5A
                ;int 0x10
                ;mov eax, 0x37373737
                ;mov edx, 0xB8000
                ;mov edi, edx
                ;mov [es:edi], eax
for             jmp for

Z gory dzieki za sugestie i porady!!!

P.S. Najwazniejsze jak dla mnie jest rozwiazanie problemu z ustawieniem odpowiednio rejestrow po starcie trybu chronionego.

Pozostało 580 znaków

2007-02-04 15:57
0
  1. Po wejściu w PMode musisz ustawić rejestry segmentowe (ds, es, ss, etc.) na wartosci selektórów z GDT (u ciebie jak dobrze widze 0x10). Potem w esp dajesz adres LINIOWY gdzie masz stos powiedzmy 0x4000. Po tym powienienes móc korzystac ze stosu. Mój kod inicializacji po przejsci w Pmode wyglada tak:

    KERNEL_CODE_SEL    equ 0x08
    KERNEL_DATA_SEL    equ 0x10
    KERNEL_STACK_SIZE  equ 0x1000
    [SECTION .text]
    ; Bootloader give control here
    _loader:
       mov cx, KERNEL_DATA_SEL ; Nie mozemy pisac bezposrednio do *s
       mov ss, cx ; Ustaw ss
       mov ds, cx ; Ustaw ds
       mov es, cx ; ustaw es
       mov esp, kstack + KERNEL_STACK_SIZE ; Ustaw esp na koniec stosu (jest zapelniany w dol)
    
       push DWORD 0x2 ; połóż nowe flagi procka
       popfd ; zaladuj do eflags
       ;.....
    [SECTION .bss]
    kstack: resb KERNEL_STACK_SIZE

//EDIT: Teraz dopiero zauważyłęm u ciebie int 0x10.
W PMODE NIE UZYWA SIE PRZERWAN BIOSU!!!!


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0