X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finit.c;h=2931704120c67bf39441ce56aa469a128b556e39;hb=d4c30c6a386fe850e7eed1025e459fbc82a0b6e2;hp=c8889f10abbe6af8b1bca6c8874adadb045678f8;hpb=837e5b7fb902bd749106309ef76a5276c73ca34c;p=pintos-anon diff --git a/src/threads/init.c b/src/threads/init.c index c8889f1..2931704 100644 --- a/src/threads/init.c +++ b/src/threads/init.c @@ -41,11 +41,6 @@ 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 file system? */ static bool format_filesys; @@ -168,15 +163,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) { @@ -184,7 +181,7 @@ 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 @@ -252,7 +249,7 @@ 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); @@ -367,7 +364,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) { @@ -385,6 +382,8 @@ power_off (void) for (p = s; *p != '\0'; p++) outb (0x8900, *p); + asm ("cli; hlt"); + printf ("still running...\n"); for (;;); }