#include "io.h"
#include "kbd.h"
#include "lib.h"
+#include "loader.h"
#include "malloc.h"
#include "mmu.h"
#include "paging.h"
/* Amount of physical memory, in 4 kB pages. */
size_t ram_pages;
+static void ram_init (void);
static void gdt_init (void);
+static void argv_init (void);
void power_off (void);
static void
main_thread (void *aux UNUSED)
{
+#ifdef FILESYS
disk_init ();
- thread_execute ("a.out");
+ filesys_init (true);
+ filesys_self_test ();
+#endif
}
int
main (void)
{
- extern char _text, _end, __bss_start;
struct thread *t;
- /* Clear out the BSS segment. */
- memset (&__bss_start, 0, &_end - &__bss_start);
-
+ /* Initialize components needed by printk() very early. */
+ ram_init ();
vga_init ();
serial_init ();
+ printk ("Booting cnachos86...\n");
/* Calculate how much RAM the kernel uses, and find out from
the bootloader how much RAM this machine has. */
- kernel_pages = (&_end - &_text + 4095) / 4096;
- ram_pages = *(uint32_t *) (0x7e00 - 6);
-
- printk ("Initializing nachos-x86, %d kB RAM detected.\n",
- ram_pages * 4);
+ printk ("ram: detected %'d kB main memory.\n", ram_pages * 4);
/* Memory from the end of the kernel through the end of memory
is free. Give it to the page allocator. */
- palloc_init ((void *) (KERN_BASE + kernel_pages * PGSIZE),
- (void *) (PHYS_BASE + ram_pages * PGSIZE));
+ palloc_init (ptov (LOADER_KERN_BASE + kernel_pages * PGSIZE),
+ ptov (ram_pages * PGSIZE));
paging_init ();
gdt_init ();
malloc_init ();
random_init ();
+ argv_init ();
+
intr_init ();
timer_init ();
kbd_init ();
-#ifdef FILESYS
- filesys_init (false);
-#endif
-
thread_init ();
t = thread_create ("main", main_thread, NULL);
asm volatile ("lgdt %0" :: "m" (gdtr_operand));
asm volatile ("ltr %w0" :: "r" (SEL_TSS));
}
+
+static void
+ram_init (void)
+{
+ /* Start and end of kernel image,
+ and start and end of BSS segment.
+ These are created by kernel.lds. */
+ extern char _start, _end;
+ extern char _start_bss, _end_bss;
+
+ /* The "BSS" is a segment that should be initialized to zeros.
+ It isn't actually stored on disk or zeroed by the kernel
+ loader, so we have to zero it ourselves. */
+ memset (&_start_bss, 0, &_end_bss - &_start_bss);
+
+ /* Calculate how much RAM the kernel uses,
+ and find out from the bootloader how much RAM this machine
+ has. */
+ kernel_pages = (&_end - &_start + 4095) / 4096;
+ ram_pages = *(uint32_t *) ptov (LOADER_BASE + LOADER_RAM_PAGES);
+}
+
+void
+argv_init (void)
+{
+ char *cmd_line = ptov (LOADER_BASE + LOADER_CMD_LINE);
+}
\f
void
power_off (void)