Modestus Moon OS  R4
CS 450 project
heap.c File Reference
#include <system.h>
#include <string.h>
#include <core/serial.h>
#include <mem/heap.h>
#include <mem/paging.h>
Include dependency graph for heap.c:

Go to the source code of this file.

Functions

u32int _kmalloc (u32int size, int page_align, u32int *phys_addr)
 
u32int kmalloc (u32int size)
 
u32int alloc (u32int size, heap *h, int align)
 
heapmake_heap (u32int base, u32int max, u32int min)
 

Variables

heapkheap = 0
 
heapcurr_heap = 0
 
page_dirkdir
 
void * end
 
void _end
 
void __end
 
u32int phys_alloc_addr = (u32int)&end
 

Function Documentation

u32int _kmalloc ( u32int  size,
int  page_align,
u32int phys_addr 
)

Definition at line 24 of file heap.c.

References alloc(), page_entry::frameaddr, get_page(), and phys_alloc_addr.

Referenced by get_page(), init_paging(), and kmalloc().

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 }
u32int frameaddr
Definition: paging.h:19
page_dir * kdir
Definition: paging.c:21
Definition: paging.h:12
u32int alloc(u32int size, heap *h, int align)
Definition: heap.c:57
u32int phys_alloc_addr
Definition: heap.c:22
heap * kheap
Definition: heap.c:14
unsigned long u32int
Definition: system.h:27
page_entry * get_page(u32int addr, page_dir *dir, int make_table)
Definition: paging.c:85
u32int alloc ( u32int  size,
heap h,
int  align 
)

Definition at line 57 of file heap.c.

References base, KHEAP_BASE, KHEAP_MIN, no_warn, and serial_println().

Referenced by _kmalloc().

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 }
u32int base
Definition: tables.h:53
#define KHEAP_MIN
Definition: heap.h:7
#define no_warn(p)
Definition: system.h:7
int serial_println(const char *msg)
Definition: serial.c:44
unsigned long u32int
Definition: system.h:27
#define KHEAP_BASE
Definition: heap.h:6
u32int kmalloc ( u32int  size)

Definition at line 52 of file heap.c.

References _kmalloc().

Referenced by init_paging(), initHeap(), make_heap(), and sys_alloc_mem().

53 {
54  return _kmalloc(size,0,0);
55 }
u32int _kmalloc(u32int size, int page_align, u32int *phys_addr)
Definition: heap.c:24
heap* make_heap ( u32int  base,
u32int  max,
u32int  min 
)

Definition at line 71 of file heap.c.

References kmalloc(), and no_warn.

Referenced by init_paging().

72 {
73  no_warn(base||max||min);
74  return (heap*)kmalloc(sizeof(heap));
75 }
u32int base
Definition: tables.h:53
#define no_warn(p)
Definition: system.h:7
Definition: heap.h:33
u32int kmalloc(u32int size)
Definition: heap.c:52

Variable Documentation

void __end
void _end
heap* curr_heap = 0

Definition at line 15 of file heap.c.

void* end
page_dir* kdir

Definition at line 21 of file paging.c.

heap* kheap = 0

Definition at line 14 of file heap.c.

u32int phys_alloc_addr = (u32int)&end

Definition at line 22 of file heap.c.

Referenced by _kmalloc(), and init_paging().