提交 ced61a3c 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

mem stealing

上级 b6d8d9ad
......@@ -21,32 +21,17 @@ extern char end[]; // first address after kernel loaded from ELF file
void
kinit(void)
{
struct run *r;
char *p;
int c;
int n;
int i;
for (c = 0; c < NCPU; c++) {
for (int c = 0; c < NCPU; c++) {
kmems[c].name[0] = (char) c;
safestrcpy(kmems[c].name+1, "kmem", MAXNAME-1);
initlock(&kmems[c].lock, kmems[c].name);
}
p = (char*)PGROUNDUP((uint)end);
n = (char*)PHYSTOP - p;
n = n / PGSIZE;
n = n / NCPU;
cprintf("n = %d end = 0x%x\n", n, p);
for (c = 0; c < NCPU; c++) {
for (i = 0; i < n; i++, p += PGSIZE) {
memset(p, 1, PGSIZE);
r = (struct run*)p;
r->next = kmems[c].freelist;
kmems[c].freelist = r;
}
}
for(; p + PGSIZE <= (char*)PHYSTOP; p += PGSIZE)
kfree(p);
}
//PAGEBREAK: 21
......@@ -69,6 +54,7 @@ kfree(char *v)
r = (struct run*)v;
r->next = kmem->freelist;
kmem->freelist = r;
kmem->nfree++;
mtrace_label_register(mtrace_label_block,
r,
0,
......@@ -85,23 +71,33 @@ kfree(char *v)
char*
kalloc(void)
{
struct run *r;
struct run *r = 0;
// cprintf("%d: kalloc 0x%x 0x%x 0x%x 0x%x 0%x\n", cpu->id, kmem, &kmems[cpu->id], kmem->freelist, PHYSTOP, kmems[1].freelist);
acquire(&kmem->lock);
r = kmem->freelist;
if(r)
kmem->freelist = r->next;
for (uint i = 0; r == 0 && i < NCPU; i++) {
struct kmem *m = &kmems[(i + cpunum()) % NCPU];
acquire(&m->lock);
r = m->freelist;
if (r) {
m->freelist = r->next;
m->nfree--;
}
release(&m->lock);
}
mtrace_label_register(mtrace_label_block,
r,
4096,
"kalloc",
sizeof("kalloc"),
RET_EIP());
release(&kmem->lock);
if (r == 0)
cprintf("%d: kalloc out\n", cpunum());
if (r == 0) {
cprintf("%d: kalloc out\n", cpunum());
for (uint i = 0; i < NCPU; i++)
cprintf("cpu %d: %d free pages\n", i, kmems[i].nfree);
}
memset(r, 2, PGSIZE);
return (char*)r;
}
......
......@@ -6,6 +6,7 @@ struct kmem {
char name[MAXNAME];
struct spinlock lock;
struct run *freelist;
uint nfree;
};
extern struct kmem kmems[NCPU];
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论