Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
cbc50063
提交
cbc50063
2月 19, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix up growproc() to use crange correctly
no need for vmap::lock anymore either
上级
e6b2a3df
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
46 行增加
和
63 行删除
+46
-63
crange.hh
include/crange.hh
+1
-1
vm.hh
include/vm.hh
+0
-2
crange.cc
kernel/crange.cc
+12
-3
proc.cc
kernel/proc.cc
+33
-49
vm.cc
kernel/vm.cc
+0
-8
没有找到文件。
include/crange.hh
浏览文件 @
cbc50063
...
@@ -135,7 +135,6 @@ struct crange {
...
@@ -135,7 +135,6 @@ struct crange {
range
*
const
crange_head
;
// a crange skip list starts with a sentinel range (key 0, sz 0)
range
*
const
crange_head
;
// a crange skip list starts with a sentinel range (key 0, sz 0)
static
void
mark
(
range
*
f
,
range
*
s
);
static
void
mark
(
range
*
f
,
range
*
s
);
static
void
freen
(
struct
range
*
f
,
struct
range
*
l
);
static
int
lock_range
(
u64
k
,
u64
sz
,
int
l
,
range
**
er
,
range
**
pr
,
range
**
fr
,
range
**
lr
,
range
**
sr
);
static
int
lock_range
(
u64
k
,
u64
sz
,
int
l
,
range
**
er
,
range
**
pr
,
range
**
fr
,
range
**
lr
,
range
**
sr
);
void
print
(
int
);
void
print
(
int
);
...
@@ -193,6 +192,7 @@ struct crange_locked {
...
@@ -193,6 +192,7 @@ struct crange_locked {
range_iterator
begin
()
const
{
return
range_iterator
(
prev_
->
next
[
0
].
ptr
());
};
range_iterator
begin
()
const
{
return
range_iterator
(
prev_
->
next
[
0
].
ptr
());
};
range_iterator
end
()
const
{
return
range_iterator
(
succ_
);
};
range_iterator
end
()
const
{
return
range_iterator
(
succ_
);
};
void
replace
(
range
*
r
);
void
replace
(
range
*
r
);
void
replace
(
range
*
prev
,
range
*
repl
);
};
};
static
inline
range_iterator
static
inline
range_iterator
...
...
include/vm.hh
浏览文件 @
cbc50063
...
@@ -48,12 +48,10 @@ struct vma : public range {
...
@@ -48,12 +48,10 @@ struct vma : public range {
// The elements of e[] are not ordered by address.
// The elements of e[] are not ordered by address.
struct
vmap
{
struct
vmap
{
struct
crange
cr
;
struct
crange
cr
;
struct
spinlock
lock
;
// serialize map/lookup/unmap
atomic
<
u64
>
ref
;
atomic
<
u64
>
ref
;
u64
alloc
;
u64
alloc
;
pgmap
*
const
pml4
;
// Page table
pgmap
*
const
pml4
;
// Page table
char
*
const
kshared
;
char
*
const
kshared
;
char
lockname
[
16
];
vmap
();
vmap
();
~
vmap
();
~
vmap
();
...
...
kernel/crange.cc
浏览文件 @
cbc50063
...
@@ -479,8 +479,11 @@ crange_locked::~crange_locked()
...
@@ -479,8 +479,11 @@ crange_locked::~crange_locked()
}
}
void
void
crange_locked
::
replace
(
range
*
repl
)
crange_locked
::
replace
(
range
*
prev
,
range
*
repl
)
{
{
if
(
!
prev
)
prev
=
prev_
;
range
*
newlast
=
0
;
range
*
newlast
=
0
;
for
(
range
*
e
=
repl
;
e
;
e
=
e
->
next
[
0
].
ptr
())
{
for
(
range
*
e
=
repl
;
e
;
e
=
e
->
next
[
0
].
ptr
())
{
assert
(
e
->
key
>=
base_
&&
e
->
key
+
e
->
size
<=
base_
+
size_
);
assert
(
e
->
key
>=
base_
&&
e
->
key
+
e
->
size
<=
base_
+
size_
);
...
@@ -493,8 +496,8 @@ crange_locked::replace(range *repl)
...
@@ -493,8 +496,8 @@ crange_locked::replace(range *repl)
// do compare-exchange first, and only then mark the old ranges as deleted;
// do compare-exchange first, and only then mark the old ranges as deleted;
// otherwise, concurrent readers may not find either old or new ranges.
// otherwise, concurrent readers may not find either old or new ranges.
range
*
replaced
=
prev
_
->
next
[
0
].
ptr
();
range
*
replaced
=
prev
->
next
[
0
].
ptr
();
prev
_
->
next
[
0
]
=
repl
?:
succ_
;
prev
->
next
[
0
]
=
repl
?:
succ_
;
crange
::
mark
(
replaced
,
succ_
);
crange
::
mark
(
replaced
,
succ_
);
for
(
range
*
e
=
replaced
;
e
&&
e
!=
succ_
;
e
=
e
->
next
[
0
].
ptr
())
{
for
(
range
*
e
=
replaced
;
e
&&
e
!=
succ_
;
e
=
e
->
next
[
0
].
ptr
())
{
...
@@ -502,3 +505,9 @@ crange_locked::replace(range *repl)
...
@@ -502,3 +505,9 @@ crange_locked::replace(range *repl)
e
->
dec_ref
();
e
->
dec_ref
();
}
}
}
}
void
crange_locked
::
replace
(
range
*
repl
)
{
replace
(
0
,
repl
);
}
kernel/proc.cc
浏览文件 @
cbc50063
...
@@ -408,74 +408,58 @@ int
...
@@ -408,74 +408,58 @@ int
growproc
(
int
n
)
growproc
(
int
n
)
{
{
struct
vmap
*
m
=
myproc
()
->
vmap
;
struct
vmap
*
m
=
myproc
()
->
vmap
;
auto
curbrk
=
myproc
()
->
brk
;
if
(
n
<
0
&&
0
-
n
<=
myproc
()
->
brk
){
if
(
n
<
0
&&
0
-
n
<=
cur
brk
){
myproc
()
->
brk
+=
n
;
myproc
()
->
brk
+=
n
;
return
0
;
return
0
;
}
}
if
(
n
<
0
||
n
>
USERTOP
||
myproc
()
->
brk
+
n
>
USERTOP
)
if
(
n
<
0
||
n
>
USERTOP
||
cur
brk
+
n
>
USERTOP
)
return
-
1
;
return
-
1
;
acquire
(
&
m
->
lock
);
// look one page ahead, to check if the newly allocated region would
// abut the next-higher vma? we can't allow that, since then a future
// find first unallocated address in brk..brk+n
// sbrk() would start to use the next region (e.g. the stack).
uptr
newstart
=
myproc
()
->
brk
;
uptr
newstart
=
PGROUNDUP
(
curbrk
);
u64
newn
=
n
;
s64
newn
=
PGROUNDUP
(
n
+
curbrk
-
newstart
);
gc_begin_epoch
();
range
*
prev
=
0
;
while
(
newn
>
0
){
auto
span
=
m
->
cr
.
search_lock
(
newstart
,
newstart
+
newn
+
PGSIZE
);
vma
*
e
=
m
->
lookup
(
newstart
,
1
);
for
(
range
*
r
:
span
)
{
if
(
e
==
0
)
vma
*
e
=
(
vma
*
)
r
;
break
;
if
(
e
->
vma_end
>=
newstart
+
newn
){
if
(
e
->
vma_start
<=
newstart
)
{
newstart
+=
newn
;
if
(
e
->
vma_end
>=
newstart
+
newn
)
{
newn
=
0
;
myproc
()
->
brk
+=
n
;
break
;
switchuvm
(
myproc
());
}
return
0
;
newn
-=
e
->
vma_end
-
newstart
;
}
newstart
=
e
->
vma_end
;
}
gc_end_epoch
();
if
(
newn
<=
0
){
// no need to allocate
myproc
()
->
brk
+=
n
;
release
(
&
m
->
lock
);
switchuvm
(
myproc
());
return
0
;
}
// is there space for newstart..newstart+newn?
if
(
m
->
lookup
(
newstart
,
newn
)
!=
0
){
cprintf
(
"growproc: not enough room in address space; brk %lx n %d
\n
"
,
myproc
()
->
brk
,
n
);
return
-
1
;
}
// would the newly allocated region abut the next-higher
newn
-=
e
->
vma_end
-
newstart
;
// vma? we can't allow that, since then a future sbrk()
newstart
=
e
->
vma_end
;
// would start to use the next region (e.g. the stack).
prev
=
e
;
if
(
m
->
lookup
(
PGROUNDUP
(
newstart
+
newn
),
1
)
!=
0
){
}
else
{
cprintf
(
"growproc: would abut next vma; brk %lx n %d
\n
"
,
cprintf
(
"growproc: overlap with existing mapping; brk %lx n %d
\n
"
,
myproc
()
->
brk
,
n
);
curbrk
,
n
);
return
-
1
;
return
-
1
;
}
}
}
vmnode
*
vmn
=
new
vmnode
(
PGROUNDUP
(
newn
)
/
PGSIZE
);
vmnode
*
vmn
=
new
vmnode
(
newn
/
PGSIZE
);
if
(
vmn
==
0
){
if
(
vmn
==
0
){
release
(
&
m
->
lock
);
cprintf
(
"growproc: vmn_allocpg failed
\n
"
);
cprintf
(
"growproc: vmn_allocpg failed
\n
"
);
return
-
1
;
return
-
1
;
}
}
release
(
&
m
->
lock
);
// XXX
vma
*
repl
=
new
vma
(
m
,
newstart
,
newstart
+
newn
,
PRIVATE
,
vmn
);
if
(
!
repl
)
{
if
(
m
->
insert
(
vmn
,
newstart
)
<
0
){
cprintf
(
"growproc: out of vma
\n
"
);
delete
vmn
;
delete
vmn
;
cprintf
(
"growproc: vmap_insert failed
\n
"
);
return
-
1
;
return
-
1
;
}
}
span
.
replace
(
prev
,
repl
);
myproc
()
->
brk
+=
n
;
myproc
()
->
brk
+=
n
;
switchuvm
(
myproc
());
switchuvm
(
myproc
());
return
0
;
return
0
;
...
...
kernel/vm.cc
浏览文件 @
cbc50063
...
@@ -140,9 +140,6 @@ vma::~vma()
...
@@ -140,9 +140,6 @@ vma::~vma()
vmap
::
vmap
()
vmap
::
vmap
()
:
cr
(
10
),
pml4
(
setupkvm
()),
kshared
((
char
*
)
ksalloc
(
slab_kshared
))
:
cr
(
10
),
pml4
(
setupkvm
()),
kshared
((
char
*
)
ksalloc
(
slab_kshared
))
{
{
snprintf
(
lockname
,
sizeof
(
lockname
),
"vmap:%p"
,
this
);
initlock
(
&
lock
,
lockname
,
LOCKSTAT_VM
);
ref
=
1
;
ref
=
1
;
alloc
=
0
;
alloc
=
0
;
...
@@ -168,7 +165,6 @@ vmap::vmap()
...
@@ -168,7 +165,6 @@ vmap::vmap()
ksfree
(
slab_kshared
,
kshared
);
ksfree
(
slab_kshared
,
kshared
);
if
(
pml4
)
if
(
pml4
)
freevm
(
pml4
);
freevm
(
pml4
);
destroylock
(
&
lock
);
}
}
vmap
::~
vmap
()
vmap
::~
vmap
()
...
@@ -178,7 +174,6 @@ vmap::~vmap()
...
@@ -178,7 +174,6 @@ vmap::~vmap()
if
(
pml4
)
if
(
pml4
)
freevm
(
pml4
);
freevm
(
pml4
);
alloc
=
0
;
alloc
=
0
;
destroylock
(
&
lock
);
}
}
void
void
...
@@ -207,9 +202,6 @@ vmap::copy(int share)
...
@@ -207,9 +202,6 @@ vmap::copy(int share)
if
(
nm
==
0
)
if
(
nm
==
0
)
return
0
;
return
0
;
scoped_acquire
sa
(
&
lock
);
// XXX how to construct a consistent copy?
for
(
range
*
r
:
cr
)
{
for
(
range
*
r
:
cr
)
{
vma
*
e
=
(
vma
*
)
r
;
vma
*
e
=
(
vma
*
)
r
;
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论