summaryrefslogtreecommitdiff
path: root/kalloc.c
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2019-06-11 09:57:14 -0400
committerRobert Morris <[email protected]>2019-06-11 09:57:14 -0400
commit5753553213df8f9de851adb68377db43faecb91f (patch)
tree3b629ff54897fca414146677532cb459a2ed11ba /kalloc.c
parent91ba81110acd3163f7de3580b677eece0c57f5e7 (diff)
downloadxv6-labs-5753553213df8f9de851adb68377db43faecb91f.tar.gz
xv6-labs-5753553213df8f9de851adb68377db43faecb91f.tar.bz2
xv6-labs-5753553213df8f9de851adb68377db43faecb91f.zip
separate source into kernel/ user/ mkfs/
Diffstat (limited to 'kalloc.c')
-rw-r--r--kalloc.c80
1 files changed, 0 insertions, 80 deletions
diff --git a/kalloc.c b/kalloc.c
deleted file mode 100644
index 1ed1c49..0000000
--- a/kalloc.c
+++ /dev/null
@@ -1,80 +0,0 @@
-// Physical memory allocator, intended to allocate
-// memory for user processes, kernel stacks, page table pages,
-// and pipe buffers. Allocates 4096-byte pages.
-
-#include "types.h"
-#include "param.h"
-#include "memlayout.h"
-#include "spinlock.h"
-#include "riscv.h"
-#include "defs.h"
-
-void freerange(void *pa_start, void *pa_end);
-
-extern char end[]; // first address after kernel loaded from ELF file
- // defined by the kernel linker script in kernel.ld
-
-struct run {
- struct run *next;
-};
-
-struct {
- struct spinlock lock;
- struct run *freelist;
-} kmem;
-
-void
-kinit()
-{
- initlock(&kmem.lock, "kmem");
- freerange(end, (void*)PHYSTOP);
-}
-
-void
-freerange(void *pa_start, void *pa_end)
-{
- char *p;
- p = (char*)PGROUNDUP((uint64)pa_start);
- for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
- kfree(p);
-}
-//PAGEBREAK: 21
-// Free the page of physical memory pointed at by v,
-// which normally should have been returned by a
-// call to kalloc(). (The exception is when
-// initializing the allocator; see kinit above.)
-void
-kfree(void *pa)
-{
- struct run *r;
-
- if(((uint64)pa % PGSIZE) != 0 || (char*)pa < end || (uint64)pa >= PHYSTOP)
- panic("kfree");
-
- // Fill with junk to catch dangling refs.
- memset(pa, 1, PGSIZE);
-
- acquire(&kmem.lock);
- r = (struct run*)pa;
- r->next = kmem.freelist;
- kmem.freelist = r;
- release(&kmem.lock);
-}
-
-// Allocate one 4096-byte page of physical memory.
-// Returns a pointer that the kernel can use.
-// Returns 0 if the memory cannot be allocated.
-void *
-kalloc(void)
-{
- struct run *r;
-
- acquire(&kmem.lock);
- r = kmem.freelist;
- if(r)
- kmem.freelist = r->next;
- release(&kmem.lock);
- if(r)
- memset((char*)r, 5, PGSIZE); // fill with junk
- return (void*)r;
-}