Тройная ошибка в собственном ядре

Я пытаюсь написать ядро, в основном в развлекательных целях, и столкнулся с проблемой, которая, по моему мнению, является тройной ошибкой. Все работало до того, как я попытался включить подкачку. Вот код, который ломается:

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

Я следил за множеством руководств / документов по этому поводу, но я использую для разбиения на страницы, таким образом, http://www.jamesmolloy.co.uk/tutorial_html/ 6.-Paging.html . Я не уверен, какой еще код будет полезен для выяснения этого, но если я должен предоставить больше, я буду более чем счастлив сделать это.

Edit =====

Я считаю, что CS, DS и SS выбирают правильные записи, вот код, используемый для их установки

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!

, и вот сама структура 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 очень похожа на эту.

9
задан Mat 5 November 2011 в 15:14
поделиться