unmap lower kernel and some fixes
This commit is contained in:
parent
b2b1fc59b7
commit
7eec8729e3
|
@ -34,7 +34,7 @@ _start:
|
||||||
mov edx, 0
|
mov edx, 0
|
||||||
.fill_table:
|
.fill_table:
|
||||||
mov ecx, edx
|
mov ecx, edx
|
||||||
or ecx, 3
|
or ecx, 7
|
||||||
mov [boot_page_tab-0xC0000000+eax*4], ecx
|
mov [boot_page_tab-0xC0000000+eax*4], ecx
|
||||||
add edx, 0x1000
|
add edx, 0x1000
|
||||||
inc eax
|
inc eax
|
||||||
|
@ -43,7 +43,7 @@ _start:
|
||||||
|
|
||||||
mov ecx, boot_page_tab
|
mov ecx, boot_page_tab
|
||||||
sub ecx, 0xC0000000
|
sub ecx, 0xC0000000
|
||||||
or ecx, 3
|
or ecx, 7
|
||||||
mov [boot_page_dir-0xC0000000], ecx
|
mov [boot_page_dir-0xC0000000], ecx
|
||||||
mov [boot_page_dir-0xC0000000+768*4], ecx
|
mov [boot_page_dir-0xC0000000+768*4], ecx
|
||||||
|
|
||||||
|
@ -59,6 +59,11 @@ _start:
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
higher_half:
|
higher_half:
|
||||||
|
; Un-identity-map kernel
|
||||||
|
mov dword [boot_page_dir], 2
|
||||||
|
; Add KERNEL_VMA to the address of the multiboot info struct
|
||||||
|
add ebx, 0xC0000000
|
||||||
|
|
||||||
; Load GDT
|
; Load GDT
|
||||||
lgdt [gdtp]
|
lgdt [gdtp]
|
||||||
; Offset to kernel data descriptor
|
; Offset to kernel data descriptor
|
||||||
|
|
|
@ -37,11 +37,13 @@ typedef struct {
|
||||||
uint32_t cr3;
|
uint32_t cr3;
|
||||||
} task_t;
|
} task_t;
|
||||||
|
|
||||||
|
#define KERNEL_VMA 0xC0000000
|
||||||
|
|
||||||
void kernel(multiboot_info_t *info) {
|
void kernel(multiboot_info_t *info) {
|
||||||
if (!CHECK_FLAG(info->flags, 3)) goto halt; // Modules
|
if (!CHECK_FLAG(info->flags, 3)) goto halt; // Modules
|
||||||
if (!CHECK_FLAG(info->flags, 6)) goto halt; // Memory map
|
if (!CHECK_FLAG(info->flags, 6)) goto halt; // Memory map
|
||||||
if (!CHECK_FLAG(info->flags, 12)) goto halt; // VBE data
|
if (!CHECK_FLAG(info->flags, 12)) goto halt; // VBE data
|
||||||
ctx.multi_mmap = (multi_mmap_t *)info->memmapaddress;
|
ctx.multi_mmap = (multi_mmap_t *)(info->memmapaddress + KERNEL_VMA);
|
||||||
ctx.multi_mmap_size = info->memmaplength;
|
ctx.multi_mmap_size = info->memmaplength;
|
||||||
|
|
||||||
if (serial_port_init(COM1)) ctx.log_method = LOG_COM1;
|
if (serial_port_init(COM1)) ctx.log_method = LOG_COM1;
|
||||||
|
@ -60,7 +62,6 @@ void kernel(multiboot_info_t *info) {
|
||||||
|
|
||||||
asm volatile ("lidt %0" :: "m"(idtr));
|
asm volatile ("lidt %0" :: "m"(idtr));
|
||||||
pic_remap(PIC_1_START, PIC_2_START);
|
pic_remap(PIC_1_START, PIC_2_START);
|
||||||
/*
|
|
||||||
asm volatile ("sti" ::);
|
asm volatile ("sti" ::);
|
||||||
|
|
||||||
ctx.ticks = 0;
|
ctx.ticks = 0;
|
||||||
|
@ -76,11 +77,12 @@ void kernel(multiboot_info_t *info) {
|
||||||
gdt[5].granularity |= 0x40;
|
gdt[5].granularity |= 0x40;
|
||||||
gdt[5].access = 0x89;
|
gdt[5].access = 0x89;
|
||||||
tss.ss0 = GDT_SEGMENT_SELECTOR(2, RING0);
|
tss.ss0 = GDT_SEGMENT_SELECTOR(2, RING0);
|
||||||
tss.esp0 = 0;
|
uint32_t esp0 = 0;
|
||||||
|
asm volatile ("mov %%esp, %0" : "=r" (esp0));
|
||||||
|
tss.esp0 = esp0;
|
||||||
tss.cs = GDT_SEGMENT_SELECTOR(3, RING3);
|
tss.cs = GDT_SEGMENT_SELECTOR(3, RING3);
|
||||||
tss.ss = tss.ds = tss.es = tss.fs = tss.gs = GDT_SEGMENT_SELECTOR(4, RING3);
|
tss.ss = tss.ds = tss.es = tss.fs = tss.gs = GDT_SEGMENT_SELECTOR(4, RING3);
|
||||||
flush_tss(GDT_SEGMENT_SELECTOR(5, RING3));
|
flush_tss(GDT_SEGMENT_SELECTOR(5, RING3));
|
||||||
*/
|
|
||||||
|
|
||||||
#define PAGE_PRESENT (1<<0)
|
#define PAGE_PRESENT (1<<0)
|
||||||
#define PAGE_RW (1<<1)
|
#define PAGE_RW (1<<1)
|
||||||
|
@ -91,10 +93,10 @@ void kernel(multiboot_info_t *info) {
|
||||||
#define PAGE_OFFSET(x) ((x) & 0xFFF)
|
#define PAGE_OFFSET(x) ((x) & 0xFFF)
|
||||||
|
|
||||||
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 + KERNEL_VMA);
|
||||||
LOG("Switching to ring 3... EIP: 0x%08X ESP: 0x%08X\n", init->mod_start, stack+0x1000);
|
LOG("Switching to ring 3... EIP: 0x%08X ESP: 0x%08X\n", init->mod_start+KERNEL_VMA, stack+0x1000);
|
||||||
|
|
||||||
//jmp_user_mode(stack+0x1000, init->mod_start);
|
jmp_user_mode(stack+0x1000, init->mod_start+KERNEL_VMA);
|
||||||
|
|
||||||
halt:
|
halt:
|
||||||
for (;;) {}
|
for (;;) {}
|
||||||
|
|
14
kernel/mem.c
14
kernel/mem.c
|
@ -13,8 +13,13 @@ void *mmap_block_to_physical(int block) {
|
||||||
|
|
||||||
uint32_t len = (uint32_t)(entry.len);
|
uint32_t len = (uint32_t)(entry.len);
|
||||||
uint32_t addr = (uint32_t)(entry.addr);
|
uint32_t addr = (uint32_t)(entry.addr);
|
||||||
if (len > offset)
|
if (len > offset) {
|
||||||
return (void *)(addr + offset);
|
uint32_t phys = (addr + offset);
|
||||||
|
if (phys < 0x00400000) {
|
||||||
|
return (void *)(phys + 0xC0000000);
|
||||||
|
}
|
||||||
|
return (void *)phys;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -67,7 +72,10 @@ uint8_t mmap_init(void) {
|
||||||
// Create map
|
// Create map
|
||||||
struct multiboot_mmap_entry entry = ctx.multi_mmap[index];
|
struct multiboot_mmap_entry entry = ctx.multi_mmap[index];
|
||||||
//uint32_t addr = (uint32_t)(entry.addr_low | entry.addr_high);
|
//uint32_t addr = (uint32_t)(entry.addr_low | entry.addr_high);
|
||||||
ctx.mmap = (uint32_t *)(uint32_t)(entry.addr & 0xffffffff);
|
if ((uint32_t)(entry.addr & UINT32_MAX) < 0x00400000)
|
||||||
|
ctx.mmap = (uint32_t *)((uint32_t)(entry.addr & UINT32_MAX) + 0xC0000000);
|
||||||
|
else
|
||||||
|
ctx.mmap = (uint32_t *)(uint32_t)(entry.addr & 0xffffffff);
|
||||||
// Zero the map
|
// Zero the map
|
||||||
memset(ctx.mmap, 0, ctx.mmap_size);
|
memset(ctx.mmap, 0, ctx.mmap_size);
|
||||||
// Reserve the blocks that hold the memory map + 1
|
// Reserve the blocks that hold the memory map + 1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user