Modestus Moon OS  R4
CS 450 project
heap.c
Go to the documentation of this file.
1 /*
2  ----- heap.c -----
3 
4  Description..: Heap management procedures.
5 */
6 
7 #include <system.h>
8 #include <string.h>
9 
10 #include <core/serial.h>
11 #include <mem/heap.h>
12 #include <mem/paging.h>
13 
14 heap* kheap = 0; //kernel heap
15 heap* curr_heap = 0; //current heap
16 
17 extern page_dir *kdir; //kernel page directory
18 extern void* end, _end, __end; //kernel end; defined in link.ld
19 
20 //physical placement address
21 //current physical memory allocation address
23 
24 u32int _kmalloc(u32int size, int page_align, u32int *phys_addr)
25 {
26  u32int *addr;
27 
28  // Allocate on the kernel heap if one has been created
29  if (kheap != 0){
30  addr = (u32int*)alloc(size, kheap, page_align);
31  if (phys_addr){
32  page_entry *page = get_page((u32int)addr, kdir, 0);
33  *phys_addr = (page->frameaddr*0x1000) + ((u32int)addr & 0xFFF);
34  }
35  return (u32int)addr;
36  }
37  // Else, allocate directly from physical memory
38  else {
39  if (page_align && (phys_alloc_addr & 0xFFFFF000)){
40  phys_alloc_addr &= 0xFFFFF000;
41  phys_alloc_addr += 0x1000;
42  }
43  addr = (u32int*)phys_alloc_addr;
44  if (phys_addr){
45  *phys_addr = phys_alloc_addr;
46  }
47  phys_alloc_addr += size;
48  return (u32int)addr;
49  }
50 }
51 
53 {
54  return _kmalloc(size,0,0);
55 }
56 
57 u32int alloc(u32int size, heap *h, int align)
58 {
59  no_warn(size||align||h);
60  static u32int heap_addr = KHEAP_BASE;
61 
62  u32int base = heap_addr;
63  heap_addr += size;
64 
65  if (heap_addr > KHEAP_BASE + KHEAP_MIN)
66  serial_println("Heap is full!");
67 
68  return base;
69 }
70 
72 {
73  no_warn(base||max||min);
74  return (heap*)kmalloc(sizeof(heap));
75 }
u32int frameaddr
Definition: paging.h:19
void _end
page_dir * kdir
Definition: paging.c:21
u32int base
Definition: tables.h:53
heap * make_heap(u32int base, u32int max, u32int min)
Definition: heap.c:71
Definition: paging.h:12
void * end
u32int alloc(u32int size, heap *h, int align)
Definition: heap.c:57
#define KHEAP_MIN
Definition: heap.h:7
#define no_warn(p)
Definition: system.h:7
u32int _kmalloc(u32int size, int page_align, u32int *phys_addr)
Definition: heap.c:24
void __end
u32int phys_alloc_addr
Definition: heap.c:22
heap * curr_heap
Definition: heap.c:15
int serial_println(const char *msg)
Definition: serial.c:44
heap * kheap
Definition: heap.c:14
Definition: heap.h:33
unsigned long u32int
Definition: system.h:27
page_entry * get_page(u32int addr, page_dir *dir, int make_table)
Definition: paging.c:85
#define KHEAP_BASE
Definition: heap.h:6
u32int kmalloc(u32int size)
Definition: heap.c:52