Implement a proper block layer with partition support.
[pintos-anon] / src / threads / palloc.c
index cef065ae98f11a9e7cac3cee0971a4435949c1ef..4fc8394c8f078a20c5a48722c36e3e022658620e 100644 (file)
@@ -7,10 +7,9 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
-#include "threads/init.h"
 #include "threads/loader.h"
-#include "threads/mmu.h"
 #include "threads/synch.h"
+#include "threads/vaddr.h"
 
 /* Page allocator.  Hands out memory in page-size (or
    page-multiple) chunks.  See malloc.h for an allocator that
@@ -35,26 +34,20 @@ struct pool
   };
 
 /* Two pools: one for kernel data, one for user pages. */
-struct pool kernel_pool, user_pool;
-
-/* Maximum number of pages to put in user pool. */
-size_t user_page_limit = SIZE_MAX;
+static struct pool kernel_pool, user_pool;
 
 static void init_pool (struct pool *, void *base, size_t page_cnt,
                        const char *name);
 static bool page_from_pool (const struct pool *, void *page);
 
-/* Initializes the page allocator. */
+/* Initializes the page allocator.  At most USER_PAGE_LIMIT
+   pages are put into the user pool. */
 void
-palloc_init (void) 
+palloc_init (size_t user_page_limit)
 {
-  /* End of the kernel as recorded by the linker.
-     See kernel.lds.S. */
-  extern char _end;
-
-  /* Free memory. */
-  uint8_t *free_start = pg_round_up (&_end);
-  uint8_t *free_end = ptov (ram_pages * PGSIZE);
+  /* Free memory starts at 1 MB and runs to the end of RAM. */
+  uint8_t *free_start = ptov (1024 * 1024);
+  uint8_t *free_end = ptov (init_ram_pages * PGSIZE);
   size_t free_pages = (free_end - free_start) / PGSIZE;
   size_t user_pages = free_pages / 2;
   size_t kernel_pages;
@@ -107,7 +100,8 @@ palloc_get_multiple (enum palloc_flags flags, size_t page_cnt)
   return pages;
 }
 
-/* Obtains and returns a single free page.
+/* Obtains a single free page and returns its kernel virtual
+   address.
    If PAL_USER is set, the page is obtained from the user pool,
    otherwise from the kernel pool.  If PAL_ZERO is set in FLAGS,
    then the page is filled with zeros.  If no pages are