Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
26e69730
提交
26e69730
3月 13, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
growproc -> vmap::sbrk
上级
9298a90d
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
80 行增加
和
79 行删除
+80
-79
vm.hh
include/vm.hh
+2
-0
proc.cc
kernel/proc.cc
+0
-78
sysproc.cc
kernel/sysproc.cc
+1
-1
vm.cc
kernel/vm.cc
+77
-0
没有找到文件。
include/vm.hh
浏览文件 @
26e69730
...
@@ -86,6 +86,8 @@ struct vmap {
...
@@ -86,6 +86,8 @@ struct vmap {
int
pagefault
(
uptr
va
,
u32
err
);
int
pagefault
(
uptr
va
,
u32
err
);
int
copyout
(
uptr
va
,
void
*
p
,
u64
len
);
int
copyout
(
uptr
va
,
void
*
p
,
u64
len
);
int
sbrk
(
int
n
);
NEW_DELETE_OPS
(
vmap
)
NEW_DELETE_OPS
(
vmap
)
uptr
brk_
;
// Top of heap
uptr
brk_
;
// Top of heap
...
...
kernel/proc.cc
浏览文件 @
26e69730
...
@@ -275,84 +275,6 @@ initproc(void)
...
@@ -275,84 +275,6 @@ initproc(void)
panic
(
"pinit"
);
panic
(
"pinit"
);
}
}
// Grow/shrink current process's memory by n bytes.
// Growing may allocate vmas and physical memory,
// but avoids interfering with any existing vma.
// Assumes vmas around proc->brk are part of the growable heap.
// Shrinking just decreases proc->brk; doesn't deallocate.
// Return 0 on success, -1 on failure.
int
growproc
(
int
n
)
{
struct
vmap
*
m
=
myproc
()
->
vmap
;
auto
curbrk
=
m
->
brk_
;
if
(
n
<
0
&&
0
-
n
<=
curbrk
){
m
->
brk_
+=
n
;
return
0
;
}
if
(
n
<
0
||
n
>
USERTOP
||
curbrk
+
n
>
USERTOP
)
return
-
1
;
// 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
// sbrk() would start to use the next region (e.g. the stack).
uptr
newstart
=
PGROUNDUP
(
curbrk
);
s64
newn
=
PGROUNDUP
(
n
+
curbrk
-
newstart
);
#if VM_CRANGE
range
*
prev
=
0
;
auto
span
=
m
->
cr
.
search_lock
(
newstart
,
newn
+
PGSIZE
);
#endif
#if VM_RADIX
auto
span
=
m
->
rx
.
search_lock
(
newstart
,
newn
+
PGSIZE
);
#endif
for
(
auto
r
:
span
)
{
vma
*
e
=
(
vma
*
)
r
;
if
(
e
->
vma_start
<=
newstart
)
{
if
(
e
->
vma_end
>=
newstart
+
newn
)
{
m
->
brk_
+=
n
;
return
0
;
}
newn
-=
e
->
vma_end
-
newstart
;
newstart
=
e
->
vma_end
;
#if VM_CRANGE
prev
=
e
;
#endif
}
else
{
cprintf
(
"growproc: overlap with existing mapping; brk %lx n %d
\n
"
,
curbrk
,
n
);
return
-
1
;
}
}
vmnode
*
vmn
=
new
vmnode
(
newn
/
PGSIZE
);
if
(
vmn
==
0
){
cprintf
(
"growproc: vmn_allocpg failed
\n
"
);
return
-
1
;
}
vma
*
repl
=
new
vma
(
m
,
newstart
,
newstart
+
newn
,
PRIVATE
,
vmn
);
if
(
!
repl
)
{
cprintf
(
"growproc: out of vma
\n
"
);
delete
vmn
;
return
-
1
;
}
#if VM_CRANGE
span
.
replace
(
prev
,
repl
);
#endif
#if VM_RADIX
span
.
replace
(
newstart
,
newn
,
repl
);
#endif
m
->
brk_
+=
n
;
return
0
;
}
// Kill the process with the given pid.
// Kill the process with the given pid.
// Process won't exit until it returns
// Process won't exit until it returns
// to user space (see trap in trap.c).
// to user space (see trap in trap.c).
...
...
kernel/sysproc.cc
浏览文件 @
26e69730
...
@@ -47,7 +47,7 @@ sys_sbrk(int n)
...
@@ -47,7 +47,7 @@ sys_sbrk(int n)
uptr
addr
;
uptr
addr
;
addr
=
myproc
()
->
vmap
->
brk_
;
addr
=
myproc
()
->
vmap
->
brk_
;
if
(
growproc
(
n
)
<
0
)
if
(
myproc
()
->
vmap
->
sbrk
(
n
)
<
0
)
return
-
1
;
return
-
1
;
return
addr
;
return
addr
;
}
}
...
...
kernel/vm.cc
浏览文件 @
26e69730
...
@@ -579,3 +579,80 @@ vmap::copyout(uptr va, void *p, u64 len)
...
@@ -579,3 +579,80 @@ vmap::copyout(uptr va, void *p, u64 len)
}
}
return
0
;
return
0
;
}
}
// Grow/shrink current process's memory by n bytes.
// Growing may allocate vmas and physical memory,
// but avoids interfering with any existing vma.
// Assumes vmas around proc->brk are part of the growable heap.
// Shrinking just decreases proc->brk; doesn't deallocate.
// Return 0 on success, -1 on failure.
int
vmap
::
sbrk
(
int
n
)
{
auto
curbrk
=
brk_
;
if
(
n
<
0
&&
0
-
n
<=
curbrk
){
brk_
+=
n
;
return
0
;
}
if
(
n
<
0
||
n
>
USERTOP
||
curbrk
+
n
>
USERTOP
)
return
-
1
;
// 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
// sbrk() would start to use the next region (e.g. the stack).
uptr
newstart
=
PGROUNDUP
(
curbrk
);
s64
newn
=
PGROUNDUP
(
n
+
curbrk
-
newstart
);
#if VM_CRANGE
range
*
prev
=
0
;
auto
span
=
cr
.
search_lock
(
newstart
,
newn
+
PGSIZE
);
#endif
#if VM_RADIX
auto
span
=
rx
.
search_lock
(
newstart
,
newn
+
PGSIZE
);
#endif
for
(
auto
r
:
span
)
{
vma
*
e
=
(
vma
*
)
r
;
if
(
e
->
vma_start
<=
newstart
)
{
if
(
e
->
vma_end
>=
newstart
+
newn
)
{
brk_
+=
n
;
return
0
;
}
newn
-=
e
->
vma_end
-
newstart
;
newstart
=
e
->
vma_end
;
#if VM_CRANGE
prev
=
e
;
#endif
}
else
{
cprintf
(
"growproc: overlap with existing mapping; brk %lx n %d
\n
"
,
curbrk
,
n
);
return
-
1
;
}
}
vmnode
*
vmn
=
new
vmnode
(
newn
/
PGSIZE
);
if
(
vmn
==
0
){
cprintf
(
"growproc: vmn_allocpg failed
\n
"
);
return
-
1
;
}
vma
*
repl
=
new
vma
(
this
,
newstart
,
newstart
+
newn
,
PRIVATE
,
vmn
);
if
(
!
repl
)
{
cprintf
(
"growproc: out of vma
\n
"
);
delete
vmn
;
return
-
1
;
}
#if VM_CRANGE
span
.
replace
(
prev
,
repl
);
#endif
#if VM_RADIX
span
.
replace
(
newstart
,
newn
,
repl
);
#endif
brk_
+=
n
;
return
0
;
}
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论