Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
75e5229e
提交
75e5229e
10月 31, 2011
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
64-bitify vm.c TREE and bonsai.c.
上级
e5ce2747
显示空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
59 行增加
和
10 行删除
+59
-10
Makefile
Makefile
+1
-0
bonsai.c
bonsai.c
+5
-6
kernel.h
kernel.h
+14
-0
vm.c
vm.c
+37
-4
vm.h
vm.h
+2
-0
没有找到文件。
Makefile
浏览文件 @
75e5229e
...
...
@@ -26,6 +26,7 @@ LDFLAGS += -m elf_x86_64
OBJS
=
\
bio.o
\
bonsai.o
\
cga.o
\
condvar.o
\
console.o
\
...
...
bonsai.c
浏览文件 @
75e5229e
#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
;
...
...
kernel.h
浏览文件 @
75e5229e
...
...
@@ -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
);
...
...
vm.c
浏览文件 @
75e5229e
...
...
@@ -44,7 +44,7 @@ vma_free(void *p)
#ifdef TREE
struct
state
{
int
share
;
void
*
p
gdir
;
void
*
p
ml4
;
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
->
p
gdir
);
freevm
(
m
->
p
ml4
);
kmfree
(
st
);
m
->
p
gdir
=
0
;
m
->
p
ml4
=
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
->
p
gdir
=
m
->
pgdir
;
st
->
p
ml4
=
m
->
pml4
;
st
->
root
=
c
->
root
;
if
(
!
tree_foreach
(
m
->
root
,
vmap_copy_vma
,
st
))
{
vmap_free
(
c
);
...
...
vm.h
浏览文件 @
75e5229e
#define TREE
// A mapping of a chunk of an address space to
// a specific memory object.
enum
vmatype
{
PRIVATE
,
COW
};
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论