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: xirx@xirx.net
; 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.