X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finit.c;h=b98e580feab1e59eae30775fd62f696cd2bd3f10;hb=9869570326bb4e6d39fb41912a9076d53a82ad2d;hp=c17316aa59efec1951ad48eed5c8e4522a3e0381;hpb=7d4e3dda080a47db88616f1c0d975f2091be47f1;p=pintos-anon diff --git a/src/threads/init.c b/src/threads/init.c index c17316a..b98e580 100644 --- a/src/threads/init.c +++ b/src/threads/init.c @@ -29,18 +29,16 @@ #endif #ifdef FILESYS #include "devices/disk.h" +#include "devices/partition.h" #include "filesys/filesys.h" #include "filesys/fsutil.h" #endif -/* Amount of physical memory, in 4 kB pages. */ -size_t ram_pages; - /* Page directory with kernel mappings only. */ uint32_t *base_page_dir; #ifdef FILESYS -/* -f: Format the filesystem? */ +/* -f: Format the file system? */ static bool format_filesys; #endif @@ -80,9 +78,9 @@ main (void) argv_init (); /* Initialize memory system. */ + paging_init (); palloc_init (); malloc_init (); - paging_init (); /* Segmentation. */ #ifdef USERPROG @@ -108,8 +106,9 @@ main (void) timer_calibrate (); #ifdef FILESYS - /* Initialize filesystem. */ + /* Initialize file system. */ disk_init (); + partition_init (); filesys_init (format_filesys); fsutil_run (); #endif @@ -152,9 +151,6 @@ ram_init (void) linker as _start_bss and _end_bss. See kernel.lds. */ extern char _start_bss, _end_bss; memset (&_start_bss, 0, &_end_bss - &_start_bss); - - /* Get RAM size from loader. See loader.S. */ - ram_pages = *(uint32_t *) ptov (LOADER_RAM_PAGES); } /* Populates the base page directory and page table with the @@ -163,8 +159,8 @@ ram_init (void) directory it creates. At the time this function is called, the active page table - (set up by loader.S) only maps the first 4 MB of RAM, so we - should not try to use extravagant amounts of memory. + (set up by start.S) only maps the first 4 MB of RAM, so we + should not try to access memory beyond that limit. Fortunately, there is no need to do so. */ static void paging_init (void) @@ -172,8 +168,8 @@ paging_init (void) uint32_t *pd, *pt; size_t page; - pd = base_page_dir = palloc_get_page (PAL_ASSERT | PAL_ZERO); - pt = NULL; + pd = base_page_dir = ptov (LOADER_PD_BASE); + pt = ptov (LOADER_PT_BASE); for (page = 0; page < ram_pages; page++) { uintptr_t paddr = page * PGSIZE; @@ -183,16 +179,22 @@ paging_init (void) if (pd[pde_idx] == 0) { - pt = palloc_get_page (PAL_ASSERT | PAL_ZERO); + pt += PGSIZE / sizeof *pt; + memset (pt, 0, PGSIZE); pd[pde_idx] = pde_create (pt); } pt[pte_idx] = pte_create_kernel (vaddr, true); } + /* start.S mapped the beginning of physical memory to virtual + address 0. We don't want that mapping anymore, so erase + it. */ + pd[0] = 0; + /* 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 + aka PDBR (page directory base register). This flushes the + TLB to make sure . See [IA32-v2a] "MOV--Move to/from Control Registers" and [IA32-v3] 3.7.5. */ asm volatile ("mov %%cr3, %0" :: "r" (vtop (base_page_dir))); } @@ -267,15 +269,15 @@ argv_init (void) " -ul USER_MAX Limit user memory to USER_MAX pages.\n" #endif #ifdef FILESYS - " -f Format the filesystem disk (hdb or hd0:1).\n" + " -f Format the file system disk (hdb or hd0:1).\n" " -ci FILENAME SIZE Copy SIZE bytes from the scratch disk (hdc\n" - " or hd1:0) into the filesystem as FILENAME\n" + " or hd1:0) into the file system as FILENAME\n" " -co FILENAME Copy FILENAME to the scratch disk, with\n" " size at start of sector 0 and data afterward\n" " -p FILENAME Print the contents of FILENAME\n" " -r FILENAME Delete FILENAME\n" - " -ls List the files in the filesystem\n" - " -D Dump complete filesystem contents\n" + " -ls List the files in the file system\n" + " -D Dump complete file system contents\n" #endif " -q Power off after doing requested actions.\n" " -u Print this help message and power off.\n"