diff --git a/Makefile b/Makefile index 6ba1d6d..b50dca0 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ endif # riscv64-unknown-elf- or riscv64-linux-gnu- # perhaps in /opt/riscv/bin -#TOOLPREFIX = +TOOLPREFIX = /opt/riscv/bin/riscv64-unknown-elf- # Try to infer the correct TOOLPREFIX if not set ifndef TOOLPREFIX diff --git a/fs.img.bk b/fs.img.bk new file mode 100644 index 0000000..2bd36ab Binary files /dev/null and b/fs.img.bk differ diff --git a/kernel/kalloc.c b/kernel/kalloc.c index 0699e7e..7a09849 100644 --- a/kernel/kalloc.c +++ b/kernel/kalloc.c @@ -21,12 +21,13 @@ struct run { struct { struct spinlock lock; struct run *freelist; -} kmem; +} kmem[NCPU]; -void +void kinit() { - initlock(&kmem.lock, "kmem"); + for(int i=0;i= PHYSTOP) @@ -55,11 +58,11 @@ kfree(void *pa) memset(pa, 1, PGSIZE); r = (struct run*)pa; - - acquire(&kmem.lock); - r->next = kmem.freelist; - kmem.freelist = r; - release(&kmem.lock); + acquire(&kmem[cpu].lock); + r->next = kmem[cpu].freelist; + kmem[cpu].freelist = r; + release(&kmem[cpu].lock); + pop_off(); } // Allocate one 4096-byte page of physical memory. @@ -68,15 +71,33 @@ kfree(void *pa) void * kalloc(void) { + push_off(); struct run *r; - - acquire(&kmem.lock); - r = kmem.freelist; + const int cpu=cpuid(); + acquire(&kmem[cpu].lock); + r = kmem[cpu].freelist; if(r) - kmem.freelist = r->next; - release(&kmem.lock); - + kmem[cpu].freelist = r->next; + while(!r) + for(int i=0;inext; + goto fine; + } + release(&kmem[i].lock); + continue; + fine: + break; + } + release(&kmem[cpu].lock); if(r) memset((char*)r, 5, PGSIZE); // fill with junk + pop_off(); return (void*)r; }