Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
2e184ff9
提交
2e184ff9
3月 31, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Try pre-zeroing with wqs
上级
f71b44c4
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
97 行增加
和
11 行删除
+97
-11
main.cc
kernel/main.cc
+2
-0
uaccess.S
kernel/uaccess.S
+10
-2
zalloc.cc
kernel/zalloc.cc
+85
-9
没有找到文件。
kernel/main.cc
浏览文件 @
2e184ff9
...
...
@@ -22,6 +22,7 @@ void initnmi(void);
void
inittrap
(
void
);
void
initseg
(
void
);
void
initkalloc
(
u64
mbaddr
);
void
initz
(
void
);
void
initrcu
(
void
);
void
initproc
(
void
);
void
initbio
(
void
);
...
...
@@ -107,6 +108,7 @@ cmain(u64 mbmagic, u64 mbaddr)
inittrap
();
initlapic
();
initkalloc
(
mbaddr
);
initz
();
initproc
();
// process table
initsched
();
// scheduler run queues
initidle
();
...
...
kernel/uaccess.S
浏览文件 @
2e184ff9
...
...
@@ -48,10 +48,17 @@ __fetch_end:
movl $0, PROC_UACCESS(%r11)
ret
.globl
clear_
page
.globl
z
page
.align 8
clear_
page:
z
page:
movl $4096/8,%ecx
xorl %eax,%eax
rep stosq
ret
// XXX(sbw) should skip first cache line, prefetchnt, then zero
.globl zrun_nc
.align 8
zrun_nc:
jmp zpage
\ No newline at end of file
kernel/zalloc.cc
浏览文件 @
2e184ff9
...
...
@@ -4,34 +4,110 @@
#include "percpu.hh"
#include "wq.hh"
#include "kalloc.hh"
#include "cpputil.hh"
extern
"C"
void
clear_page
(
void
*
);
extern
"C"
void
zpage
(
void
*
);
extern
"C"
void
zrun_nc
(
run
*
);
struct
zallocator
{
run
*
run
;
kmem
kmem
;
wframe
frame
;
};
void
init
(
int
);
char
*
alloc
(
const
char
*
);
void
free
(
char
*
);
void
tryrefill
();
};
percpu
<
zallocator
>
z_
;
struct
zwork
:
public
work
{
zwork
(
wframe
*
frame
,
zallocator
*
zer
)
:
frame_
(
frame
),
zer_
(
zer
)
{
frame_
->
inc
();
}
virtual
void
run
()
{
for
(
int
i
=
0
;
i
<
32
;
i
++
)
{
struct
run
*
r
=
(
struct
run
*
)
kalloc
(
"zpage"
);
if
(
r
==
nullptr
)
break
;
zrun_nc
(
r
);
zer_
->
kmem
.
free
(
r
);
}
frame_
->
dec
();
delete
this
;
}
wframe
*
frame_
;
zallocator
*
zer_
;
NEW_DELETE_OPS
(
zwork
);
};
//
// zallocator
//
void
zallocator
::
tryrefill
(
void
)
{
if
(
kmem
.
nfree
<
16
&&
frame
.
zero
())
{
zwork
*
w
=
new
zwork
(
&
frame
,
this
);
if
(
wq_push
(
w
)
<
0
)
delete
w
;
}
}
void
zallocator
::
init
(
int
c
)
{
frame
.
clear
();
kmem
.
name
[
0
]
=
(
char
)
c
+
'0'
;
safestrcpy
(
kmem
.
name
+
1
,
"zmem"
,
MAXNAME
-
1
);
kmem
.
size
=
PGSIZE
;
}
char
*
zalloc
(
const
char
*
name
)
zalloc
ator
::
alloc
(
const
char
*
name
)
{
char
*
p
=
kalloc
(
name
);
if
(
p
)
clear_page
(
p
);
char
*
p
;
p
=
(
char
*
)
kmem
.
alloc
(
name
);
if
(
p
==
nullptr
)
{
p
=
kalloc
(
name
);
if
(
p
!=
nullptr
)
zpage
(
p
);
}
tryrefill
();
return
p
;
}
void
zallocator
::
free
(
char
*
p
)
{
if
(
0
)
for
(
int
i
=
0
;
i
<
4096
;
i
++
)
assert
(
p
[
i
]
==
0
);
kmem
.
free
((
struct
run
*
)
p
);
}
char
*
zalloc
(
const
char
*
name
)
{
return
z_
->
alloc
(
name
);
}
void
zfree
(
char
*
p
)
{
k
free
(
p
);
z_
->
free
(
p
);
}
void
initz
(
void
)
{
for
(
int
i
=
0
;
i
<
NCPU
;
i
++
)
z_
[
i
].
frame
.
clear
(
);
for
(
int
c
=
0
;
c
<
NCPU
;
c
++
)
z_
[
c
].
init
(
c
);
}
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论