Blady przy wejsciu do trybu chronionego

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.

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!!!!

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