aboutsummaryrefslogtreecommitdiff
path: root/kernel/include
diff options
context:
space:
mode:
authorAlex Auvolat <alex.auvolat@ens.fr>2014-12-03 17:20:29 +0100
committerAlex Auvolat <alex.auvolat@ens.fr>2014-12-03 17:20:29 +0100
commitd78a3d8be9c194554580cb3c73c1c5ebd0d82a9b (patch)
tree68f05ca7bedff54a5b7ec20bbcc33232b235a44f /kernel/include
parent6a56675851c16a0cefcf5a2d10a1227c37e9d886 (diff)
downloadkogata-d78a3d8be9c194554580cb3c73c1c5ebd0d82a9b.tar.gz
kogata-d78a3d8be9c194554580cb3c73c1c5ebd0d82a9b.zip
Improve region allocator with an idea to break dependency cycle
Diffstat (limited to 'kernel/include')
-rw-r--r--kernel/include/paging.h2
-rw-r--r--kernel/include/region.h8
2 files changed, 8 insertions, 2 deletions
diff --git a/kernel/include/paging.h b/kernel/include/paging.h
index 5766e65..7082e2e 100644
--- a/kernel/include/paging.h
+++ b/kernel/include/paging.h
@@ -13,6 +13,8 @@ pagedir_t *get_kernel_pagedir();
void switch_pagedir(pagedir_t *pd);
+// The three functions below DO NOT DEPEND on argument pd for
+// addresses above K_HIGHHALF_ADDR, so just pass 0 to map/unmap in kernel space.
uint32_t pd_get_frame(pagedir_t *pd, size_t vaddr); // get physical frame for virtual address
int pd_map_page(pagedir_t *pd,
size_t vaddr, uint32_t frame_id,
diff --git a/kernel/include/region.h b/kernel/include/region.h
index 701e2d9..3c64081 100644
--- a/kernel/include/region.h
+++ b/kernel/include/region.h
@@ -8,8 +8,7 @@
// Region types
#define REGION_T_KERNEL_BASE 0x00000001 // base kernel code & data
#define REGION_T_DESCRIPTORS 0x00000002 // contains more region descriptors
-#define REGION_T_PAGEDIR 0x00000010 // used to map a page directory
-#define REGION_T_PAGETABLE 0x00000020 // used to map a page table
+#define REGION_T_PAGETABLE 0x00000010 // used to map a page table/page directory
#define REGION_T_CORE_HEAP 0x00000100 // used for the core kernel heap
#define REGION_T_PROC_HEAP 0x00000200 // used for a kernel process' heap
#define REGION_T_CACHE 0x00001000 // used for cache
@@ -30,4 +29,9 @@ size_t region_alloc(size_t size, uint32_t type, page_fault_handler_t pf); // ret
region_info_t *find_region(size_t addr);
void region_free(size_t addr);
+#define N_PAGES_IN_PT_REGION 4
+// special call for use by paging code
+// allocates a region of N_PAGES_IN_PT_REGION pages
+size_t region_alloc_for_pt();
+
void dbg_print_region_stats();