fixed paging problem
This commit is contained in:
parent
faa6ce0757
commit
bd20049519
|
@ -80,18 +80,6 @@ flush_tss:
|
||||||
ltr [esp+4]
|
ltr [esp+4]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
global enable_paging
|
|
||||||
enable_paging:
|
|
||||||
push eax
|
|
||||||
mov eax, [esp+4]
|
|
||||||
mov cr3, eax
|
|
||||||
|
|
||||||
mov eax, cr0
|
|
||||||
or eax, 0x80000000
|
|
||||||
mov cr0, eax
|
|
||||||
pop eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
extern exception_handler
|
extern exception_handler
|
||||||
%macro isr_err_stub 1
|
%macro isr_err_stub 1
|
||||||
isr_stub_%+%1:
|
isr_stub_%+%1:
|
||||||
|
|
|
@ -17,7 +17,6 @@ extern void pit_isr(void);
|
||||||
extern void jmp_user_mode(uint32_t esp, uint32_t eip);
|
extern void jmp_user_mode(uint32_t esp, uint32_t eip);
|
||||||
extern void flush_tss(uint32_t segment_selector);
|
extern void flush_tss(uint32_t segment_selector);
|
||||||
extern gdt_t gdt[6];
|
extern gdt_t gdt[6];
|
||||||
extern void enable_paging(uint32_t *page_directory);
|
|
||||||
|
|
||||||
void exception_handler(int_stack_frame_t r) {
|
void exception_handler(int_stack_frame_t r) {
|
||||||
LOG("Exception 0x%X (0x%X) has occurred\nEAX: 0x%08X\nECX: 0x%08X\nEDX: 0x%08X\nEBX: 0x%08X\nESI: 0x%08X\nEDI: 0x%08X\nEBP: 0x%08X\nESP: 0x%08X\n",
|
LOG("Exception 0x%X (0x%X) has occurred\nEAX: 0x%08X\nECX: 0x%08X\nEDX: 0x%08X\nEBX: 0x%08X\nESI: 0x%08X\nEDI: 0x%08X\nEBP: 0x%08X\nESP: 0x%08X\n",
|
||||||
|
@ -94,17 +93,25 @@ void kernel(multiboot_info_t *info) {
|
||||||
#define PAGE_TAB_INDEX(x) (((x) >> 12) & 0x3FF)
|
#define PAGE_TAB_INDEX(x) (((x) >> 12) & 0x3FF)
|
||||||
#define PAGE_OFFSET(x) ((x) & 0xFFF)
|
#define PAGE_OFFSET(x) ((x) & 0xFFF)
|
||||||
|
|
||||||
LOG("Page directory: %08X -- Page table: %08X\n", page_dir, page_tab);
|
|
||||||
|
|
||||||
for (int i = 0; i < 1024; i++) {
|
for (int i = 0; i < 1024; i++) {
|
||||||
page_tab[i] = (i * 0x1000) | PAGE_PRESENT | PAGE_RW | PAGE_USER;
|
page_tab[i] = (i * 0x1000) | PAGE_PRESENT | PAGE_RW | PAGE_USER;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 1024; i++) {
|
for (int i = 0; i < 1024; i++) {
|
||||||
page_dir[i] = ((uint32_t)page_tab) | PAGE_PRESENT | PAGE_RW | PAGE_USER;
|
page_dir[i] = ((uint32_t)page_tab) | PAGE_PRESENT | PAGE_RW | PAGE_USER;
|
||||||
}
|
}
|
||||||
|
|
||||||
enable_paging(page_dir);
|
//enable_paging(page_dir);
|
||||||
|
asm volatile("mov %0, %%cr3" :: "r" (page_dir));
|
||||||
|
|
||||||
|
asm volatile(
|
||||||
|
"mov %%cr0, %%eax;"
|
||||||
|
"or $0x80000000, %%eax;"
|
||||||
|
"mov %%eax, %%cr0;"
|
||||||
|
:
|
||||||
|
:
|
||||||
|
: "%eax"
|
||||||
|
);
|
||||||
|
|
||||||
uint32_t stack = (uint32_t)mmap_find_first_free_block();
|
uint32_t stack = (uint32_t)mmap_find_first_free_block();
|
||||||
multi_mod_t *init = (multi_mod_t *)info->moduleaddress;
|
multi_mod_t *init = (multi_mod_t *)info->moduleaddress;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user