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