Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
310f8cb8
提交
310f8cb8
2月 19, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
vma inherits from range
上级
7dd0fbb3
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
26 行增加
和
35 行删除
+26
-35
crange.hh
include/crange.hh
+5
-9
vm.hh
include/vm.hh
+2
-2
crange.cc
kernel/crange.cc
+4
-8
vm.cc
kernel/vm.cc
+15
-16
没有找到文件。
include/crange.hh
浏览文件 @
310f8cb8
...
...
@@ -88,11 +88,6 @@ struct range : public rcu_freed {
private
:
u64
key
;
u64
size
;
public
:
rcu_freed
*
value
;
private
:
atomic
<
int
>
curlevel
;
// the current levels it appears on
int
nlevel
;
// the number of levels this range should appear
crange
*
cr
;
// the crange this range is part of
...
...
@@ -102,14 +97,16 @@ struct range : public rcu_freed {
void
print
(
int
l
);
void
dec_ref
(
void
);
int
lockif
(
markptr
<
range
>
e
);
~
range
();
friend
class
crange
;
friend
class
crange_locked
;
friend
class
range_iterator
;
protected
:
~
range
();
public
:
range
(
crange
*
cr
,
u64
k
,
u64
sz
,
rcu_freed
*
v
,
range
*
n
,
int
nlevel
=
0
);
range
(
crange
*
cr
,
u64
k
,
u64
sz
,
int
nlevel
=
0
);
virtual
void
do_gc
()
{
delete
this
;
...
...
@@ -181,10 +178,9 @@ struct crange_locked {
scoped_gc_epoch
gc
;
crange_locked
(
crange
*
cr
,
u64
base
,
u64
size
,
range
*
p
,
range
*
f
,
range
*
l
,
range
*
s
);
friend
class
crange
;
crange_locked
(
const
crange_locked
&
)
=
delete
;
crange_locked
&
operator
=
(
const
crange_locked
&
)
=
delete
;
friend
class
crange
;
public
:
crange_locked
(
crange_locked
&&
x
);
...
...
include/vm.hh
浏览文件 @
310f8cb8
...
...
@@ -32,7 +32,7 @@ struct vmnode {
// a specific memory object.
enum
vmatype
{
PRIVATE
,
COW
};
struct
vma
:
public
r
cu_freed
{
struct
vma
:
public
r
ange
{
uptr
vma_start
;
// start of mapping
uptr
vma_end
;
// one past the last byte
enum
vmatype
va_type
;
...
...
@@ -40,7 +40,7 @@ struct vma : public rcu_freed {
struct
spinlock
lock
;
// serialize fault/unmap
char
lockname
[
16
];
vma
();
vma
(
vmap
*
vmap
,
uptr
start
,
uptr
end
);
~
vma
();
virtual
void
do_gc
()
{
delete
this
;
}
...
...
kernel/crange.cc
浏览文件 @
310f8cb8
...
...
@@ -86,7 +86,7 @@ void
range
::
print
(
int
l
)
{
cprintf
(
"0x%lx-0x%lx(%lu) 0x%lx, c %d, t %d, n 0x%lx m %d
\n
"
,
key
,
key
+
size
,
size
,
(
long
)
value
,
curlevel
.
load
(),
nlevel
,
key
,
key
+
size
,
size
,
(
long
)
this
,
curlevel
.
load
(),
nlevel
,
(
long
)
next
,
(
bool
)
next
[
l
].
mark
());
}
...
...
@@ -100,8 +100,6 @@ range::~range()
}
kmalignfree
(
lock
);
kmfree
(
next
);
if
(
value
)
value
->
do_gc
();
}
void
...
...
@@ -116,13 +114,12 @@ range::dec_ref(void)
}
}
range
::
range
(
crange
*
crarg
,
u64
k
,
u64
sz
,
rcu_freed
*
v
,
range
*
n
,
int
nl
)
range
::
range
(
crange
*
crarg
,
u64
k
,
u64
sz
,
int
nl
)
:
rcu_freed
(
"range_delayed"
)
{
dprintf
(
"range::range: %lu %lu %d
\n
"
,
k
,
sz
,
nl
);
key
=
k
;
size
=
sz
;
value
=
v
;
cr
=
crarg
;
assert
(
cr
->
nlevel
>
0
);
curlevel
=
0
;
...
...
@@ -130,8 +127,7 @@ range::range(crange *crarg, u64 k, u64 sz, rcu_freed *v, range *n, int nl)
else
nlevel
=
nl
;
next
=
new
markptr
<
range
>
[
nlevel
];
// cache align?
assert
(
next
);
next
[
0
]
=
n
;
for
(
int
l
=
1
;
l
<
nlevel
;
l
++
)
next
[
l
]
=
0
;
for
(
int
l
=
0
;
l
<
nlevel
;
l
++
)
next
[
l
]
=
0
;
assert
(
kmalign
((
void
**
)
&
lock
,
CACHELINE
,
sizeof
(
struct
spinlock
))
==
0
);
initlock
(
lock
,
"crange"
,
LOCKSTAT_CRANGE
);
...
...
@@ -210,7 +206,7 @@ crange::crange(int nl)
{
assert
(
nl
>
0
);
nlevel
=
nl
;
crange_head
=
new
range
(
this
,
0
,
0
,
n
ullptr
,
nullptr
,
n
level
);
crange_head
=
new
range
(
this
,
0
,
0
,
nlevel
);
dprintf
(
"crange::crange return 0x%lx
\n
"
,
(
u64
)
this
);
}
...
...
kernel/vm.cc
浏览文件 @
310f8cb8
...
...
@@ -119,8 +119,9 @@ vmnode::load(inode *iparg, u64 offarg, u64 szarg)
* vma
*/
vma
::
vma
()
:
rcu_freed
(
"vma"
),
vma_start
(
0
),
vma_end
(
0
),
va_type
(
PRIVATE
),
n
(
0
)
vma
::
vma
(
vmap
*
vmap
,
uptr
start
,
uptr
end
)
:
range
(
&
vmap
->
cr
,
start
,
end
-
start
),
vma_start
(
start
),
vma_end
(
end
),
va_type
(
PRIVATE
),
n
(
0
)
{
snprintf
(
lockname
,
sizeof
(
lockname
),
"vma:%p"
,
this
);
initlock
(
&
lock
,
lockname
,
LOCKSTAT_VM
);
...
...
@@ -199,16 +200,16 @@ vmap::copy(int share)
return
0
;
scoped_acquire
sa
(
&
lock
);
// XXX how to construct a consistent copy?
for
(
range
*
r
:
cr
)
{
struct
vma
*
ne
=
new
vma
();
vma
*
e
=
(
vma
*
)
r
;
scoped_acquire
sae
(
&
e
->
lock
);
struct
vma
*
ne
=
new
vma
(
nm
,
e
->
vma_start
,
e
->
vma_end
);
if
(
ne
==
0
)
goto
err
;
struct
vma
*
e
=
(
struct
vma
*
)
r
->
value
;
scoped_acquire
sae
(
&
e
->
lock
);
ne
->
vma_start
=
e
->
vma_start
;
ne
->
vma_end
=
e
->
vma_end
;
if
(
share
)
{
ne
->
n
=
e
->
n
;
ne
->
va_type
=
COW
;
...
...
@@ -233,7 +234,7 @@ vmap::copy(int share)
auto
span
=
nm
->
cr
.
search_lock
(
ne
->
vma_start
,
ne
->
vma_end
-
ne
->
vma_start
);
for
(
auto
x
__attribute__
((
unused
))
:
span
)
assert
(
0
);
/* span must be empty */
span
.
replace
(
ne
w
range
(
&
nm
->
cr
,
ne
->
vma_start
,
ne
->
vma_end
-
ne
->
vma_start
,
ne
,
0
)
);
span
.
replace
(
ne
);
}
if
(
share
)
{
...
...
@@ -262,7 +263,7 @@ vmap::lookup(uptr start, uptr len)
range
*
r
=
cr
.
search
(
start
,
len
);
if
(
r
!=
0
)
{
vma
*
e
=
(
struct
vma
*
)
(
r
->
value
)
;
vma
*
e
=
(
vma
*
)
r
;
if
(
e
->
vma_end
<=
e
->
vma_start
)
panic
(
"malformed va"
);
if
(
e
->
vma_start
<
start
+
len
&&
e
->
vma_end
>
start
)
...
...
@@ -282,24 +283,22 @@ vmap::insert(vmnode *n, uptr vma_start)
u64
len
=
n
->
npages
*
PGSIZE
;
auto
span
=
cr
.
search_lock
(
vma_start
,
len
);
for
(
auto
r
:
span
)
{
vma
*
rvma
=
(
vma
*
)
r
->
value
;
vma
*
rvma
=
(
vma
*
)
r
;
cprintf
(
"vmap::insert: overlap with 0x%lx--0x%lx
\n
"
,
rvma
->
vma_start
,
rvma
->
vma_end
);
return
-
1
;
}
// XXX handle overlaps
e
=
new
vma
();
e
=
new
vma
(
this
,
vma_start
,
vma_start
+
len
);
if
(
e
==
0
)
{
cprintf
(
"vmap::insert: out of vmas
\n
"
);
return
-
1
;
}
e
->
vma_start
=
vma_start
;
e
->
vma_end
=
vma_start
+
len
;
e
->
n
=
n
;
n
->
ref
++
;
span
.
replace
(
new
range
(
&
cr
,
vma_start
,
len
,
e
,
0
)
);
span
.
replace
(
e
);
}
updatepages
(
pml4
,
e
->
vma_start
,
e
->
vma_end
,
[](
atomic
<
pme_t
>
*
p
)
{
...
...
@@ -324,7 +323,7 @@ vmap::remove(uptr vma_start, uptr len)
auto
span
=
cr
.
search_lock
(
vma_start
,
len
);
for
(
auto
r
:
span
)
{
vma
*
rvma
=
(
vma
*
)
r
->
value
;
vma
*
rvma
=
(
vma
*
)
r
;
if
(
rvma
->
vma_start
<
vma_start
||
rvma
->
vma_end
>
vma_end
)
{
cprintf
(
"vmap::remove: partial unmap not supported
\n
"
);
return
-
1
;
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论