2010-11-02 13 views
9

Próbuję napisać jądro, głównie w celach rozrywkowych, a ja napotykam problem, gdy sądzę, że to potknięcie. Wszystko działało, zanim spróbowałem włączyć stronicowanie. Kod, który łamie to:Usterka potrójna w rodzimym jądrze

void switch_page_directory(page_directory_t *dir){ 

current_directory = dir; 
asm volatile("mov %0, %%cr3":: "r"(&dir->tablesPhysical)); 

u32int cr0; 
asm volatile("mov %%cr0, %0": "=r"(cr0)); 

cr0 |= 0x80000000;//enable paging 
asm volatile("mov %0, %%cr0":: "r"(cr0)); //this line breaks 


}//switch page directory 

śledzę różne tutoriale/dokumentów na ten jeden, ale używam do stronicowania jest zatem http://www.jamesmolloy.co.uk/tutorial_html/6.-Paging.html. Nie jestem pewien, jaki inny kod będzie przydatny w ustalaniu tego, ale jeśli jest coś, co powinienem podać, z przyjemnością to zrobię.

Edit =====

wierzę, CS, DS i SS są wybierając odpowiednie wpisy tutaj jest kod używany do ustawiania im

global gdt_flush  
extern gp    
gdt_flush: 

    lgdt [gp]  ; Load the GDT with our 'gp' which is a special pointer 
    mov ax, 0x10  ; 0x10 is the offset in the GDT to our data segment 

    mov ds, ax 
    mov es, ax 
    mov fs, ax 
    mov gs, ax 
    mov ss, ax 

    jmp 0x08:flush2 ; 0x08 is the offset to our code segment: Far jump! 

flush2: 
    ret    ; Returns back to the C code! 

a tu sama struktura GDT

struct gdt_entry{ 
    unsigned short limit_low; 
    unsigned short base_low; 
    unsigned char base_middle; 
    unsigned char access; 
    unsigned char granularity; 
    unsigned char base_high; 
} __attribute__((packed)); 

struct gdt_ptr{ 
    unsigned short limit; 
    unsigned int base; 
} __attribute__((packed)); 

struct gdt_entry gdt[5]; 
struct gdt_ptr gp; 

IDT jest bardzo podobny do tego.

+0

Co dokładnie dzieje się po uruchomieniu problematycznej linii? – sth

+0

Maszyna wirtualna uruchamia się ponownie i przywracana do programu ładującego. – bschaffer13

+0

Nie sądzę, że jest tu wystarczająco dużo informacji: wiele rzeczy mogło się nie udać, szczególnie jeśli miksujesz różne tutoriale. Jak skonfigurować GDT? Czy CS, DS i SS (przynajmniej) wybierają odpowiednie wpisy GDT? A co z IDT? Czy tabele stron zostały poprawnie skonfigurowane do mapowania tożsamości? W jakim środowisku maszyny wirtualnej to uruchamiasz? –

Odpowiedz

6

GDT: nie mów co zawartość wpisów GDT są, ale rzeczy masz pokazane wygląda dość podobnie do earlier part of the tutorial you linked to a jeśli masz ustawione wpisy w ten sam sposób, a następnie wszystko powinno być dobrze (tj. płaskie odwzorowanie segmentu z segmentem kodu 0 pierścienia dla CS, segment danych segmentu 0 dla wszystkich pozostałych, zarówno z podstawą 0, jak iz limitem 4 GB).

IDT: Prawdopodobnie nie ma to znaczenia, jeśli przerywania są wyłączone i nie (jeszcze) spodziewasz się spowodować błędy strony.

Tabele stron: nieprawidłowe tabele wydają się być najbardziej prawdopodobnym podejrzanym. Upewnij się, że mapowanie tożsamości obejmuje wszystkich kodów kodu, danych i stosu, z którego korzystasz (przynajmniej).

Kod źródłowy związana u dołu http://www.jamesmolloy.co.uk/tutorial_html/6.-Paging.html pewno buduje coś, robi pracę poprawnie zarówno z QEMU i Bochs, więc mam nadzieję, że można porównać to, co robisz z tym, co to robi, i wyszło to, co jest źle .

QEMU jest ogólnie dobry, ale polecam Bochs do tworzenia rzeczy naprawdę niskiego poziomu - zawiera (lub może być skonfigurowany do włączenia) bardzo przydatny internal debugger. na przykład reset_on_triple_fault=0 ustawiony na linii pliku konfiguracyjnego cpu: ustawić punkt przerwania w kodzie switch_page_directory(), biegać do przerwania, a następnie instrukcje jednoetapowo i zobaczyć co się dzieje ...

+0

Dziękuję, ustawię Bochs, z których korzystałem tylko qemu, ponieważ to właśnie zainstalowało laboratorium na mojej uczelni. – bschaffer13

+0

jeszcze jedno pytanie, jeśli wiesz z góry, jak mogę sprawić, żeby Boch odczytał dyskietkę.img Nie mogę zrobić sudo losetup/dev/loop0 floppy.img, ponieważ nie jestem na komputerze Mam dostęp do sudo do – bschaffer13

+0

Ty może po prostu wskazać na plik, a nie urządzenie loopback. na przykład 'floppya: 1_44 = floppy.img, status = wstawiony'. –

2

Można połączyć qemu do sesji debuggera gdb za pośrednictwem narzędzia zdalnego debuggera w gdb. Można to zrobić wydając następujące polecenia:

qemu -s [optional arguments] 

Następnie wewnątrz sesji gdb, otwórz plik wykonywalny jądra, a po ustawieniu break-punkt w funkcji switch_page_directory(), wpisz następujące polecenie w wierszu gdb:

target remote localhost:1234 

następnie można jednoetapowe przez jądrze przy zerwaniu, i zobaczyć, gdzie potrójne usterka ma miejsce.

Kolejnym krokiem do rozważenia jest faktyczne zainstalowanie domyślnych procedur obsługi wyjątków w IDT ... powód, dla którego jesteś potrójnym błędem, jest spowodowany przez wyjątek wyrzucany przez procesor, ale nie ma odpowiedniej procedury obsługi wyjątków do obsługi to. Tak więc przy niektórych domyślnych programach obsługi, w szczególności obsłudze podwójnego błędu, można skutecznie zatrzymać jądro bez przechodzenia w potrójny błąd, który automatycznie resetuje komputer.

Na koniec upewnij się, że ponownie zaprogramowałeś PIC, zanim przejdziesz do trybu chronionego ... w przeciwnym razie domyślne przerwania sprzętowe zaprogramowane do uruchamiania z BIOS-u w trybie rzeczywistym spowodują teraz przerwania wyjątków w trybie chronionym.

1

Miałem również ten sam problem z samouczkiem stronicowania.Ale po kilku poszukiwaniach znalazłem rozwiązanie, które miało miejsce, ponieważ od razu po włączeniu stronicowania, wszystkie adresy stają się wirtualne, a aby go rozwiązać, musimy zmapować adresy wirtualne do tych samych adresów fizycznych, więc odnoszą się do tej samej rzeczy i nazywa się to mapowaniem tożsamości .

możesz śledzić to link, aby uzyskać dalszą pomoc w implementacji Mapowania Tożsamości.

i jeszcze jedna rzecz, na którą ustawiłeś nowo przydzieloną spację na zero, ponieważ może ona zawierać wartości śmieci, a memset nie został zrobiony w tutorialu, będzie działał na plikach bochs, ponieważ ustawia dla ciebie przestrzeń zerową, ale inny emulator (qemu) a prawdziwy sprzęt jest tak dobry.