提交 064fac47 编写于 作者: Z Zihao Yu

*-nemu,vme: zero page allocated from OS

上级 81065463
......@@ -8,6 +8,12 @@ static void* (*pgalloc_usr)(size_t) = NULL;
static void (*pgfree_usr)(void*) = NULL;
static int vme_enable = 0;
static inline void *new_page() {
void *p = pgalloc_usr(PGSIZE);
memset(p, 0, PGSIZE);
return p;
}
int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
pgalloc_usr = pgalloc_f;
pgfree_usr = pgfree_f;
......@@ -17,7 +23,7 @@ int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
}
void _protect(_AddressSpace *as) {
as->ptr = (PTE*)(pgalloc_usr(PGSIZE));
as->ptr = new_page();
as->pgsize = PGSIZE;
as->area = USER_SPACE;
}
......@@ -46,7 +52,7 @@ void _map(_AddressSpace *as, void *va, void *pa, int prot) {
PTE *pdir = (PTE*)as->ptr;
PTE *pde = &pdir[PDX(va)];
if (!(*pde & PTE_V)) {
*pde = PTE_V | (uint32_t)pgalloc_usr(PGSIZE);
*pde = PTE_V | (uintptr_t)new_page();
}
PTE *pte = &((PTE*)PTE_ADDR(*pde))[PTX(va)];
if (!(*pte & PTE_V)) {
......
......@@ -46,14 +46,17 @@ static inline uintptr_t get_satp() {
return satp << 12; // the mode bits will be shifted out
}
static inline void *new_page() {
void *p = pgalloc_usr(PGSIZE);
memset(p, 0, PGSIZE);
return p;
}
int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
pgalloc_usr = pgalloc_f;
pgfree_usr = pgfree_f;
kas.ptr = pgalloc_f(PGSIZE);
// make all PTEs invalid
memset(kas.ptr, 0, PGSIZE);
kas.ptr = new_page();
int i;
for (i = 0; i < LENGTH(segments); i ++) {
void *va = segments[i].start;
......@@ -69,7 +72,7 @@ int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
}
void _protect(_AddressSpace *as) {
PTE *updir = (PTE*)(pgalloc_usr(PGSIZE));
PTE *updir = new_page();
as->ptr = updir;
as->area = USER_SPACE;
as->pgsize = PGSIZE;
......@@ -101,7 +104,7 @@ void _map(_AddressSpace *as, void *va, void *pa, int prot) {
pg_base = (PTE *)PTE_ADDR(*pte);
if (level == 0) break;
if (!(*pte & PTE_V)) {
pg_base = pgalloc_usr(PGSIZE);
pg_base = new_page();
*pte = PTE_V | (PN(pg_base) << 10);
}
}
......
......@@ -15,14 +15,17 @@ static _Area segments[] = { // Kernel memory mappings
#define USER_SPACE RANGE(0x40000000, 0xc0000000)
static inline void *new_page() {
void *p = pgalloc_usr(PGSIZE);
memset(p, 0, PGSIZE);
return p;
}
int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
pgalloc_usr = pgalloc_f;
pgfree_usr = pgfree_f;
kas.ptr = pgalloc_f(PGSIZE);
// make all PTEs invalid
memset(kas.ptr, 0, PGSIZE);
kas.ptr = new_page();
int i;
for (i = 0; i < LENGTH(segments); i ++) {
void *va = segments[i].start;
......@@ -39,7 +42,7 @@ int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
}
void _protect(_AddressSpace *as) {
PTE *updir = (PTE*)(pgalloc_usr(PGSIZE));
PTE *updir = new_page();
as->ptr = updir;
as->area = USER_SPACE;
as->pgsize = PGSIZE;
......@@ -71,7 +74,7 @@ void _map(_AddressSpace *as, void *va, void *pa, int prot) {
pg_base = (PTE *)PTE_ADDR(*pte);
if (level == 0) break;
if (!(*pte & PTE_P)) {
pg_base = pgalloc_usr(PGSIZE);
pg_base = new_page();
*pte = PTE_P | PTE_W | PTE_U | (uintptr_t)pg_base;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册