[main] Fix multiboot in some instances. Enabling paging can squash the multiboot header, so we want to back it up to somewhere safe.

This commit is contained in:
Kevin Lange 2011-01-20 23:21:32 -06:00
parent dc5c3855de
commit 018fe42d40
4 changed files with 94 additions and 88 deletions

28
core/array.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef ARRAY_H
#define ARRAY_H
#include <system.h>
typedef void * type_t;
typedef signed char (*lessthan_predicate_t)(type_t, type_t);
typedef struct {
type_t *array;
uint32_t size;
uint32_t max_size;
lessthan_predicate_t less_than;
} ordered_array_t;
signed char standard_lessthan_predicate(type_t a, type_t b);
ordered_array_t create_ordered_array(uint32_t max_size, lessthanpredicate_t less_than);
ordered_array_t place_ordered_array(void *addr, uint32_t max_size, lessthan_predicate_t less_than);
void destroy_ordered_array(ordered_array_t *array);
void insert_ordered_array(type_t item, ordered_array_t *array);
type_t loopup_ordered_array(uint32_t i, ordered_array_t *array);
void remove_ordered_array(uint32_t i, ordered_array_t *array);
#endif

View File

@ -5,6 +5,17 @@
#include <system.h>
typedef struct {
uint32_t magic;
char is_hole;
uint32_t size;
} header_t;
typedef struct {
uint32_t magic;
header_t * header;
} footer_t;
extern uintptr_t end;
uintptr_t placement_pointer = &end;

View File

@ -145,5 +145,6 @@ resettextcolor() {
*/
void init_video() {
textmemptr = (unsigned short *)0xB8000;
cls();
csr_y = 10;
move_csr();
}

98
main.c
View File

@ -97,48 +97,21 @@ outportb(
__asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}
/*
* 99 Bottles of Beer on the -Wall
* Sample kernel mode program.
*/
void beer() {
int i = 99;
while (i > 0) {
if (i == 1) {
puts ("One bottle of beer on the wall, one bottle of beer. Take one down, pass it around, ");
} else {
kprintf("%d bottles of beer on the wall, %d bottles of beer...\n", i, i);
}
i--;
if (i == 1) {
puts("One bottle of beer on the wall.\n");
} else {
kprintf("%d bottles of beer on the wall.\n", i);
}
timer_wait(3);
}
puts("No more bottles of beer on the wall.\n");
struct multiboot *
copy_multiboot(
struct multiboot *mboot_ptr
) {
struct multiboot *new_header = (struct multiboot *)kmalloc(sizeof(struct multiboot));
memcpy(new_header, mboot_ptr, sizeof(struct multiboot));
return new_header;
}
/*
* kernel entry point
*/
int
main(struct multiboot *mboot_ptr) {
gdt_install();
idt_install();
isrs_install();
irq_install();
init_video();
paging_install(mboot_ptr->mem_upper + 1024);
timer_install();
keyboard_install();
/* Yes, yes, these are #define'd strings, consider this a nice test of kprintf */
settextcolor(12,0);
kprintf("[%s %s]\n", KERNEL_UNAME, KERNEL_VERSION_STRING);
settextcolor(1,0);
/* Multiboot Debug */
kprintf("Received the following MULTIBOOT data:\n");
void
dump_multiboot(
struct multiboot *mboot_ptr
) {
resettextcolor();
kprintf("MULTIBOOT header at 0x%x:\n", (uintptr_t)mboot_ptr);
settextcolor(7,0);
kprintf("Flags : 0x%x ", mboot_ptr->flags);
kprintf("Mem Lo: 0x%x ", mboot_ptr->mem_lower);
@ -165,40 +138,33 @@ main(struct multiboot *mboot_ptr) {
kprintf("VBE of: 0x%x ", mboot_ptr->vbe_interface_off);
kprintf("VBE le: 0x%x\n", mboot_ptr->vbe_interface_len);
resettextcolor();
kprintf("(End multiboot raw data)\n");
kprintf("Started with: %s\n", (char *)mboot_ptr->cmdline);
kprintf("Booted from: %s\n", (char *)mboot_ptr->boot_loader_name);
kprintf("%dkB lower memory\n", mboot_ptr->mem_lower);
kprintf("%dkB higher memory ", mboot_ptr->mem_upper);
int mem_mb = mboot_ptr->mem_upper / 1024;
kprintf("(%dMB)\n", mem_mb);
}
settextcolor(7,0);
kprintf("Testing colors...\n");
resettextcolor();
int i;
for (i = 0; i < 16; ++i) {
settextcolor(i,i);
putch(' ');
}
putch('\n');
/*
* kernel entry point
*/
int
main(struct multiboot *mboot_ptr) {
mboot_ptr = copy_multiboot(mboot_ptr);
gdt_install();
idt_install();
isrs_install();
irq_install();
init_video();
settextcolor(12,0);
kprintf("[%s %s]\n", KERNEL_UNAME, KERNEL_VERSION_STRING);
paging_install(mboot_ptr->mem_upper);
dump_multiboot(mboot_ptr);
timer_install();
keyboard_install();
/* Yes, yes, these are #define'd strings, consider this a nice test of kprintf */
resettextcolor();
settextcolor(9,0);
kprintf(" = Roadmap = \n");
kprintf("- Paging\n");
kprintf("- Heap\n");
kprintf("- VFS\n");
kprintf("- Initial ramdisk\n");
kprintf("- Task switching\n");
kprintf("- User mode execution\n");
kprintf("- EXT2\n");
resettextcolor();
kprintf("Kernel is finished booting. Press `q` to produce a page fault.\n");
//for (;;);
return 0;
}