X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finit.c;h=5893ce970b21fe12f707e4c3be55767e31c0034f;hb=53a7f5d0952a4595f252247f5ee3d017468eb57e;hp=a899921d953aef64ba2c88b01e8a15cece263278;hpb=97c0fe728053129a23dfc556e96fdf4000e7017f;p=pintos-anon diff --git a/src/threads/init.c b/src/threads/init.c index a899921..5893ce9 100644 --- a/src/threads/init.c +++ b/src/threads/init.c @@ -9,6 +9,7 @@ #include #include #include "devices/kbd.h" +#include "devices/input.h" #include "devices/serial.h" #include "devices/timer.h" #include "devices/vga.h" @@ -16,8 +17,8 @@ #include "threads/io.h" #include "threads/loader.h" #include "threads/malloc.h" -#include "threads/mmu.h" #include "threads/palloc.h" +#include "threads/pte.h" #include "threads/thread.h" #ifdef USERPROG #include "userprog/process.h" @@ -40,13 +41,8 @@ size_t ram_pages; /* Page directory with kernel mappings only. */ uint32_t *base_page_dir; -/* -mlfqs: - If false (default), use round-robin scheduler. - If true, use multi-level feedback queue scheduler. */ -bool enable_mlfqs; - #ifdef FILESYS -/* -f: Format the filesystem? */ +/* -f: Format the file system? */ static bool format_filesys; #endif @@ -75,21 +71,18 @@ main (void) /* Clear BSS and get machine's RAM size. */ ram_init (); - /* Initialize ourselves as a thread so we can use locks. */ - thread_init (); + /* Break command line into arguments and parse options. */ + argv = read_command_line (); + argv = parse_options (argv); - /* Initialize the console so we can use printf(). */ - vga_init (); - serial_init_poll (); - console_init (); + /* Initialize ourselves as a thread so we can use locks, + then enable console locking. */ + thread_init (); + console_init (); /* Greet user. */ printf ("Pintos booting with %'zu kB RAM...\n", ram_pages * PGSIZE / 1024); - /* Break command line into arguments and parse options. */ - argv = read_command_line (); - argv = parse_options (argv); - /* Initialize memory system. */ palloc_init (); malloc_init (); @@ -101,13 +94,11 @@ main (void) gdt_init (); #endif - /* Set random seed if parse_options() didn't. */ - random_init (0); - /* Initialize interrupt handlers. */ intr_init (); timer_init (); kbd_init (); + input_init (); #ifdef USERPROG exception_init (); syscall_init (); @@ -119,7 +110,7 @@ main (void) timer_calibrate (); #ifdef FILESYS - /* Initialize filesystem. */ + /* Initialize file system. */ disk_init (); filesys_init (format_filesys); #endif @@ -166,15 +157,17 @@ paging_init (void) { uint32_t *pd, *pt; size_t page; + extern char _start, _end_kernel_text; pd = base_page_dir = palloc_get_page (PAL_ASSERT | PAL_ZERO); pt = NULL; for (page = 0; page < ram_pages; page++) { uintptr_t paddr = page * PGSIZE; - void *vaddr = ptov (paddr); + char *vaddr = ptov (paddr); size_t pde_idx = pd_no (vaddr); size_t pte_idx = pt_no (vaddr); + bool in_kernel_text = &_start <= vaddr && vaddr < &_end_kernel_text; if (pd[pde_idx] == 0) { @@ -182,14 +175,15 @@ paging_init (void) pd[pde_idx] = pde_create (pt); } - pt[pte_idx] = pte_create_kernel (vaddr, true); + pt[pte_idx] = pte_create_kernel (vaddr, !in_kernel_text); } /* Store the physical address of the page directory into CR3 aka PDBR (page directory base register). This activates our new page tables immediately. See [IA32-v2a] "MOV--Move - to/from Control Registers" and [IA32-v3] 3.7.5. */ - asm volatile ("movl %0, %%cr3" :: "r" (vtop (base_page_dir))); + to/from Control Registers" and [IA32-v3a] 3.7.5 "Base Address + of the Page Directory". */ + asm volatile ("movl %0, %%cr3" : : "r" (vtop (base_page_dir))); } /* Breaks the kernel command line into words and returns them as @@ -218,7 +212,10 @@ read_command_line (void) /* Print kernel command line. */ printf ("Kernel command line:"); for (i = 0; i < argc; i++) - printf (" %s", argv[i]); + if (strchr (argv[i], ' ') == NULL) + printf (" %s", argv[i]); + else + printf (" '%s'", argv[i]); printf ("\n"); return argv; @@ -246,14 +243,13 @@ parse_options (char **argv) else if (!strcmp (name, "-rs")) random_init (atoi (value)); else if (!strcmp (name, "-mlfqs")) - enable_mlfqs = true; + thread_mlfqs = true; #ifdef USERPROG else if (!strcmp (name, "-ul")) user_page_limit = atoi (value); #endif else PANIC ("unknown option `%s' (use -h for help)", name); - } return argv; @@ -362,7 +358,7 @@ usage (void) /* Powers down the machine we're running on, - as long as we're running on Bochs or qemu. */ + as long as we're running on Bochs or QEMU. */ void power_off (void) { @@ -380,6 +376,8 @@ power_off (void) for (p = s; *p != '\0'; p++) outb (0x8900, *p); + asm volatile ("cli; hlt" : : : "memory"); + printf ("still running...\n"); for (;;); }