[Assembler] Stronnicowanie nie działa

0

Co jest źle w tym kodzie włączającym stronnicowanie?

 mov [ds:SYS_PGDIR+0xC00], dword KERNEL_PGTBL | 3 

Zapis adresu PageTable zawierającego jedną stronę kodu kernela, tak żeby pokazywała pod 0xC0000000(będzie to strona 0xC0000, po podzieleniu przez ilość stron per PageTable dostajemy 0x300, mnożąc razy rozmiar PDE dostajemy 0xC00). Najpierw zapisujemy adres z 12ma pierwszymi bitami wyzerowanymi, a potem dajemy Present i Read/Write.

 mov [ds:KERNEL_PGTBL], dword 3 

Nie potrzebujemy adresu bo ta strona wskazuje na 0x0 gdzie znajduje się kod kernela. Dajemy jej tylko Presenta i Read/Write.

mov eax, SYS_PGDIR
mov cr3, eax

Zapisujemy do CR3 adres katalogu z pierwszymi 12 bitami wyzerowanymi.

mov eax, cr0
or eax, 0x80000000
mov cr0, eax

Logicznie rzecz biorąc włączamy stronnicowanie

 jmp 08h:mojeip+0xC0000000
mojeip: 

Odśwież eip /* dodane */

SYS_PGDIR equ 0x7E000
KERNEL_PGTBL equ 0x7D000
0

Page Fault?

Jesli nie to dziwne, jesli tak no to eip wciaz jest ustawione na ta pamiec "na dole", tak samo jak stos, segmenty (nie wiem czy to wazne w twoim przypadku) itp.

Tak w ogole to moglbys powiedziec cos wiecej, co nie dziala, czym to sie objawia...

0

Następna instrukcja w BOCHS'ie po mov cr0, eax wywala błąd Physical memory not available(fetch spod ???). Po tym normalnie jest JUMP do poprawnego EIP. Kernel jest mapowany liniowo

0

No pomysl, po wlaczeniu stronicowania ip wskazuje nadal na "stara" pamiec, co z tego, ze jmp powinien zalatwic sprawe jak tej instrukcji nie widac.

0

Ale NAWET jak wsadzę nam NOP'a to nie jest wykonany(nopa zamiast jumpa), bo następny fetch w BOCHS'ie pojawia się spod adresu ???.

Na kompie rzeczywistym triplefaultuje !!

0

A jak ma sie wykonac skoro go nie widac [glowa] . Jak nie zmapujesz obszaru gdzie jest ip to bedziec cos takiego mial, przeciez to logiczne.

A 3faultuje bo: pierwszy blad: obszar w ktorym jest ip nie istnieje to ciezko zeby wykonac znajdujaca sie tam instrukcje, drugi: pagefault, czyli odczytanie deskryptora wyjatku z idt ktorej tez nie ma zmapowanej (drugi pagefault), znowu odczytanie deskryptowa pagefaulta ktorego nie ma - trzeci pagefault - reset.

0

ALE OCZYWIŚCIE ŻE MAPUJE OBSZAR GDZIE JEST IP I JEST TO PIERWSZA STRONA KTÓRA JEST MAPOWANA W 0xC0000000. A CO DO MAPOWANIA CZEGOŚ W 0x0 TO NIE JEST POTRZEBNE BO PROCESOR WYKONUJE INSTRUKCJE Z PIQ!

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