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.
Co dokładnie dzieje się po uruchomieniu problematycznej linii? – sth
Maszyna wirtualna uruchamia się ponownie i przywracana do programu ładującego. – bschaffer13
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? –