diff options
author | Robert Morris <[email protected]> | 2019-06-11 09:57:14 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2019-06-11 09:57:14 -0400 |
commit | 5753553213df8f9de851adb68377db43faecb91f (patch) | |
tree | 3b629ff54897fca414146677532cb459a2ed11ba /kalloc.c | |
parent | 91ba81110acd3163f7de3580b677eece0c57f5e7 (diff) | |
download | xv6-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.c | 80 |
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; -} |