X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finit.c;h=ef67071aec53daceb476b02faf3af4fe48fd7824;hb=cfbade23277061d4ab0d26a2fb350b98657e7302;hp=1afa8653dc6c828f8ab79ad3c500ce69eaee5cc0;hpb=a23e3e47eb037b5de510b9661635e3df0a5bfdd0;p=pintos-anon diff --git a/src/threads/init.c b/src/threads/init.c index 1afa865..ef67071 100644 --- a/src/threads/init.c +++ b/src/threads/init.c @@ -55,33 +55,40 @@ static bool do_power_off; static void ram_init (void); static void paging_init (void); static void argv_init (void); +static void print_stats (void); int main (void) NO_RETURN; int main (void) { - /* Initialize everything needed for printf() first. */ + /* Clear BSS and get machine's RAM size. */ ram_init (); + + /* Initialize ourselves as a thread so we can use locks. */ thread_init (); + + /* Initialize the console so we can use printf(). */ vga_init (); serial_init_poll (); console_init (); /* Greet user. */ - printf ("Pintos booting with %'zd kB RAM...\n", ram_pages * (PGSIZE / 1024)); + printf ("Pintos booting with %'zu kB RAM...\n", ram_pages * PGSIZE / 1024); /* Parse command line. */ argv_init (); - /* Initialize memory system, segments, paging. */ + /* Initialize memory system. */ palloc_init (); + malloc_init (); paging_init (); + + /* Segmentation. */ #ifdef USERPROG tss_init (); gdt_init (); #endif - malloc_init (); /* Set random seed if argv_init() didn't. */ random_init (0); @@ -121,14 +128,15 @@ main (void) #endif } #else + /* Run the compiled-in test function. */ test (); #endif + /* Finish up. */ if (do_power_off) power_off (); - - /* Terminate this thread. */ - thread_exit (); + else + thread_exit (); } /* Clear BSS and obtain RAM size from loader. */ @@ -221,9 +229,11 @@ argv_init (void) #ifdef USERPROG else if (!strcmp (argv[i], "-ex")) initial_program = argv[++i]; + else if (!strcmp (argv[i], "-ul")) + user_page_limit = atoi (argv[++i]); #endif #ifdef FILESYS - else if (!strcmp (argv[i], "-f")) + else if (!strcmp (argv[i], "-f")) format_filesys = true; else if (!strcmp (argv[i], "-ci")) { @@ -249,6 +259,7 @@ argv_init (void) " -d CLASS[,...] Enable the given classes of debug messages.\n" #ifdef USERPROG " -ex 'PROG [ARG...]' Run PROG, passing the optional arguments.\n" + " -ul USER_MAX Limit user memory to USER_MAX pages.\n" #endif #ifdef FILESYS " -f Format the filesystem disk (hdb or hd0:1).\n" @@ -282,6 +293,8 @@ power_off (void) filesys_done (); #endif + print_stats (); + printf ("Powering off...\n"); serial_flush (); @@ -289,3 +302,19 @@ power_off (void) outb (0x8900, *p); for (;;); } + +/* Print statistics about Pintos execution. */ +static void +print_stats (void) +{ + timer_print_stats (); + thread_print_stats (); +#ifdef FILESYS + disk_print_stats (); +#endif + console_print_stats (); + kbd_print_stats (); +#ifdef USERPROG + exception_print_stats (); +#endif +}