Start of a zero'd page allocator

上级 78489020
......@@ -238,6 +238,10 @@ void uartintr(void);
void switchvm(struct proc*);
int pagefault(struct vmap *, uptr, u32);
// zalloc.cc
char* zalloc(const char* name);
void zfree(char* p);
// other exported/imported functions
void cmain(u64 mbmagic, u64 mbaddr);
void mpboot(void);
......
......@@ -30,7 +30,8 @@ struct cwork : public work {
};
struct wframe {
wframe(int v) : v_(v) {}
wframe(int v = 0) : v_(v) {}
void clear() { v_ = 0; }
int inc() { return __sync_add_and_fetch(&v_, 1); }
int dec() { return __sync_sub_and_fetch(&v_, 1); }
bool zero() volatile { return v_ == 0; };
......
......@@ -49,6 +49,7 @@ OBJS = \
trapasm.o \
wq.o \
script.o \
zalloc.o \
incbin.o
OBJS := $(addprefix $(O)/kernel/, $(OBJS))
......
......@@ -15,7 +15,6 @@ __fetchint64:
mov $0, %rax
jmp __fetch_end
.code64
.globl __fetchstr
.align 8
// rdi kernel dst
......@@ -43,9 +42,16 @@ __fetchstr:
2: // Done
jmp __fetch_end
.code64
.globl __fetch_end
.align 8
__fetch_end:
movl $0, PROC_UACCESS(%r11)
ret
.globl clear_page
.align 8
clear_page:
movl $4096/8,%ecx
xorl %eax,%eax
rep stosq
ret
......@@ -72,15 +72,14 @@ vmnode::allocpg()
if (page[i])
continue;
char *p = kalloc("(vmnode::allocpg)");
char *p = zalloc("(vmnode::allocpg)");
if (!p) {
cprintf("allocpg: out of memory, leaving half-filled vmnode\n");
return -1;
}
memset(p, 0, PGSIZE);
if(!cmpxch(&page[i], (char*) 0, p))
kfree(p);
zfree(p);
}
return 0;
}
......
#include "types.h"
#include "amd64.h"
#include "kernel.hh"
#include "percpu.hh"
#include "wq.hh"
#include "kalloc.hh"
extern "C" void clear_page(void*);
struct zallocator {
run* run;
wframe frame;
};
percpu<zallocator> z_;
char*
zalloc(const char* name)
{
char* p = kalloc(name);
if (p)
clear_page(p);
return p;
}
void
zfree(char* p)
{
kfree(p);
}
void
initz(void)
{
for (int i = 0; i < NCPU; i++)
z_[i].frame.clear();
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论