提交 75e5229e 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

64-bitify vm.c TREE and bonsai.c.

上级 e5ce2747
...@@ -26,6 +26,7 @@ LDFLAGS += -m elf_x86_64 ...@@ -26,6 +26,7 @@ LDFLAGS += -m elf_x86_64
OBJS = \ OBJS = \
bio.o \ bio.o \
bonsai.o \
cga.o \ cga.o \
condvar.o \ condvar.o \
console.o \ console.o \
......
#include "types.h" #include "types.h"
#include "defs.h"
#include "param.h" #include "param.h"
#include "memlayout.h" #include "kernel.h"
#include "mmu.h" #include "mmu.h"
#include "spinlock.h" #include "spinlock.h"
...@@ -26,7 +25,7 @@ struct node { ...@@ -26,7 +25,7 @@ struct node {
struct kv kv; struct kv kv;
int size; int size;
node_t *r, *l; node_t *r, *l;
} __attribute__ ((aligned (CACHELINE))); } __mpalign__;
static node_t* static node_t*
alloc_node(struct kv *kv, node_t *l, node_t *r) alloc_node(struct kv *kv, node_t *l, node_t *r)
...@@ -77,7 +76,7 @@ tree_print(node_t *n, int depth) ...@@ -77,7 +76,7 @@ tree_print(node_t *n, int depth)
} }
struct kv* struct kv*
tree_find(node_t *n, int key) tree_find(node_t *n, u64 key)
{ {
if (n == 0) return 0; if (n == 0) return 0;
...@@ -88,7 +87,7 @@ tree_find(node_t *n, int key) ...@@ -88,7 +87,7 @@ tree_find(node_t *n, int key)
} }
struct kv* struct kv*
tree_find_gt(node_t *n, int key) tree_find_gt(node_t *n, u64 key)
{ {
struct kv *r = 0; struct kv *r = 0;
...@@ -252,7 +251,7 @@ tree_delprime(node_t *l, node_t *r) ...@@ -252,7 +251,7 @@ tree_delprime(node_t *l, node_t *r)
} }
node_t* node_t*
tree_remove(node_t *n, int key) tree_remove(node_t *n, u64 key)
{ {
node_t *t; node_t *t;
......
...@@ -24,6 +24,7 @@ struct condvar; ...@@ -24,6 +24,7 @@ struct condvar;
struct context; struct context;
struct vmnode; struct vmnode;
struct inode; struct inode;
struct node;
struct file; struct file;
struct stat; struct stat;
struct proc; struct proc;
...@@ -36,6 +37,19 @@ struct buf* bread(u32, u64, int writer); ...@@ -36,6 +37,19 @@ struct buf* bread(u32, u64, int writer);
void brelse(struct buf*, int writer); void brelse(struct buf*, int writer);
void bwrite(struct buf*); void bwrite(struct buf*);
// bonsai.c
struct kv {
u64 key;
void *val;
};
struct kv* tree_find(struct node *n, u64 key);
struct kv* tree_find_gt(struct node *n, u64 key);
struct node* tree_insert(struct node *n, struct kv *kv);
struct node* tree_remove(struct node *n, u64 key);
int tree_foreach(struct node *n, int (*cb)(struct kv* kv, void *), void *);
void tree_test(void);
// cga.c // cga.c
void cgaputc(int c); void cgaputc(int c);
......
...@@ -44,7 +44,7 @@ vma_free(void *p) ...@@ -44,7 +44,7 @@ vma_free(void *p)
#ifdef TREE #ifdef TREE
struct state { struct state {
int share; int share;
void *pgdir; void *pml4;
struct node *root; struct node *root;
}; };
...@@ -65,9 +65,9 @@ vmap_free(void *p) ...@@ -65,9 +65,9 @@ vmap_free(void *p)
st->root = m->root; st->root = m->root;
tree_foreach(m->root, vmap_free_vma, st); tree_foreach(m->root, vmap_free_vma, st);
m->root = st->root; m->root = st->root;
freevm(m->pgdir); freevm(m->pml4);
kmfree(st); kmfree(st);
m->pgdir = 0; m->pml4 = 0;
m->alloc = 0; m->alloc = 0;
} }
#else #else
...@@ -311,6 +311,39 @@ vmn_copy(struct vmnode *n) ...@@ -311,6 +311,39 @@ vmn_copy(struct vmnode *n)
} }
static int static int
vmap_copy_vma(struct kv *kv, void *_st)
{
struct state *st = (struct state *) _st;
struct vma *e = (struct vma *) kv->val;
struct vma *c = vma_alloc();
if (c == 0) {
return 0;
}
c->va_start = e->va_start;
c->va_end = e->va_end;
if (st->share) {
c->n = e->n;
c->va_type = COW;
acquire(&e->lock);
e->va_type = COW;
updatepages(st->pml4, (void *) (e->va_start), (void *) (e->va_end), PTE_COW);
release(&e->lock);
} else {
c->n = vmn_copy(e->n);
c->va_type = e->va_type;
}
if(c->n == 0) {
return 0;
}
__sync_fetch_and_add(&c->n->ref, 1);
struct kv kv1;
kv1.key = c->va_end;
kv1.val = (void *) c;
st->root = tree_insert(st->root, &kv1);
return 1;
}
static int
vmn_doload(struct vmnode *vmn, struct inode *ip, u64 offset, u64 sz) vmn_doload(struct vmnode *vmn, struct inode *ip, u64 offset, u64 sz)
{ {
for(u64 i = 0; i < sz; i += PGSIZE){ for(u64 i = 0; i < sz; i += PGSIZE){
...@@ -337,7 +370,7 @@ vmap_copy(struct vmap *m, int share) ...@@ -337,7 +370,7 @@ vmap_copy(struct vmap *m, int share)
#ifdef TREE #ifdef TREE
struct state *st = kmalloc(sizeof(struct state)); struct state *st = kmalloc(sizeof(struct state));
st->share = share; st->share = share;
st->pgdir = m->pgdir; st->pml4 = m->pml4;
st->root = c->root; st->root = c->root;
if (!tree_foreach(m->root, vmap_copy_vma, st)) { if (!tree_foreach(m->root, vmap_copy_vma, st)) {
vmap_free(c); vmap_free(c);
......
#define TREE
// A mapping of a chunk of an address space to // A mapping of a chunk of an address space to
// a specific memory object. // a specific memory object.
enum vmatype { PRIVATE, COW}; enum vmatype { PRIVATE, COW};
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论