Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
a3649f33
提交
a3649f33
2月 19, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
constify vma::n
上级
35a7a560
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
19 行增加
和
22 行删除
+19
-22
vm.hh
include/vm.hh
+2
-2
vm.cc
kernel/vm.cc
+17
-20
没有找到文件。
include/vm.hh
浏览文件 @
a3649f33
...
...
@@ -36,11 +36,11 @@ struct vma : public range {
const
uptr
vma_start
;
// start of mapping
const
uptr
vma_end
;
// one past the last byte
const
enum
vmatype
va_type
;
struct
vmnode
*
n
;
struct
vmnode
*
const
n
;
struct
spinlock
lock
;
// serialize fault/unmap
char
lockname
[
16
];
vma
(
vmap
*
vmap
,
uptr
start
,
uptr
end
,
enum
vmatype
vtype
);
vma
(
vmap
*
vmap
,
uptr
start
,
uptr
end
,
enum
vmatype
vtype
,
vmnode
*
vmn
);
~
vma
();
virtual
void
do_gc
()
{
delete
this
;
}
...
...
kernel/vm.cc
浏览文件 @
a3649f33
...
...
@@ -119,17 +119,19 @@ vmnode::load(inode *iparg, u64 offarg, u64 szarg)
* vma
*/
vma
::
vma
(
vmap
*
vmap
,
uptr
start
,
uptr
end
,
enum
vmatype
vtype
)
vma
::
vma
(
vmap
*
vmap
,
uptr
start
,
uptr
end
,
enum
vmatype
vtype
,
vmnode
*
vmn
)
:
range
(
&
vmap
->
cr
,
start
,
end
-
start
),
vma_start
(
start
),
vma_end
(
end
),
va_type
(
vtype
),
n
(
0
)
vma_start
(
start
),
vma_end
(
end
),
va_type
(
vtype
),
n
(
vmn
)
{
if
(
n
)
n
->
ref
++
;
snprintf
(
lockname
,
sizeof
(
lockname
),
"vma:%p"
,
this
);
initlock
(
&
lock
,
lockname
,
LOCKSTAT_VM
);
}
vma
::~
vma
()
{
if
(
n
)
if
(
n
)
n
->
decref
();
destroylock
(
&
lock
);
}
...
...
@@ -215,19 +217,14 @@ vmap::copy(int share)
vma
*
e
=
(
vma
*
)
r
;
scoped_acquire
sae
(
&
e
->
lock
);
struct
vma
*
ne
=
new
vma
(
nm
,
e
->
vma_start
,
e
->
vma_end
,
share
?
COW
:
PRIVATE
);
if
(
ne
==
0
)
goto
err
;
struct
vma
*
ne
;
if
(
share
)
{
ne
->
n
=
e
->
n
;
ne
=
new
vma
(
nm
,
e
->
vma_start
,
e
->
vma_end
,
COW
,
e
->
n
)
;
// if the original vma wasn't COW, replace it with a COW vma
if
(
e
->
va_type
!=
COW
)
{
vma
*
repl
=
new
vma
(
this
,
e
->
vma_start
,
e
->
vma_end
,
COW
);
repl
->
n
=
e
->
n
;
repl
->
n
->
ref
++
;
vma
*
repl
=
new
vma
(
this
,
e
->
vma_start
,
e
->
vma_end
,
COW
,
e
->
n
);
replace_vma
(
e
,
repl
);
updatepages
(
pml4
,
e
->
vma_start
,
e
->
vma_end
,
[](
atomic
<
pme_t
>*
p
)
{
for
(;;)
{
...
...
@@ -241,13 +238,17 @@ vmap::copy(int share)
});
}
}
else
{
ne
->
n
=
e
->
n
->
copy
(
);
ne
=
new
vma
(
nm
,
e
->
vma_start
,
e
->
vma_end
,
PRIVATE
,
e
->
n
->
copy
()
);
}
if
(
ne
->
n
==
0
)
if
(
ne
==
0
)
goto
err
;
ne
->
n
->
ref
++
;
if
(
ne
->
n
==
0
)
{
delete
ne
;
goto
err
;
}
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 */
...
...
@@ -307,14 +308,12 @@ vmap::insert(vmnode *n, uptr vma_start)
// XXX handle overlaps
e
=
new
vma
(
this
,
vma_start
,
vma_start
+
len
,
PRIVATE
);
e
=
new
vma
(
this
,
vma_start
,
vma_start
+
len
,
PRIVATE
,
n
);
if
(
e
==
0
)
{
cprintf
(
"vmap::insert: out of vmas
\n
"
);
return
-
1
;
}
e
->
n
=
n
;
n
->
ref
++
;
span
.
replace
(
e
);
}
...
...
@@ -396,9 +395,7 @@ vmap::pagefault_wcow(vma *m)
return
-
1
;
}
vma
*
repl
=
new
vma
(
this
,
m
->
vma_start
,
m
->
vma_end
,
PRIVATE
);
repl
->
n
=
nodecopy
;
nodecopy
->
ref
=
1
;
vma
*
repl
=
new
vma
(
this
,
m
->
vma_start
,
m
->
vma_end
,
PRIVATE
,
nodecopy
);
replace_vma
(
m
,
repl
);
updatepages
(
pml4
,
m
->
vma_start
,
m
->
vma_end
,
[](
atomic
<
pme_t
>
*
p
)
{
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论