Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
ca9a35c1
提交
ca9a35c1
4月 28, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'old-types' into scale-amd64
上级
ef921d5f
7ba4c12c
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
78 行增加
和
15 行删除
+78
-15
Makefile
Makefile
+4
-1
bench.cc
bin/bench.cc
+16
-14
filebench.cc
bin/filebench.cc
+4
-0
file.hh
include/file.hh
+1
-0
file.cc
kernel/file.cc
+26
-0
sysfile.cc
kernel/sysfile.cc
+27
-0
没有找到文件。
Makefile
浏览文件 @
ca9a35c1
...
...
@@ -131,8 +131,11 @@ mscan.sorted: mscan.out $(QEMUSRC)/mtrace-tools/sersec-sort
rsync
:
$(KERN)
rsync
-avP
$(KERN)
amsterdam.csail.mit.edu:/tftpboot/
$(HW)
/kernel.xv6
ifneq
($(HW),tom)
IPMIOPTS
=
-A
MD5
-U
ADMIN
endif
reboot
:
ipmitool
-I
lanplus
-A
MD5
-H
$(HW)
adm.csail.mit.edu
-U
ADMIN
-f
.passwd.
$(HW)
power reset
ipmitool
-I
lanplus
$(IPMIOPTS)
-H
$(HW)
adm.csail.mit.edu
-f
.passwd.
$(HW)
power reset
bench
:
/bin/echo
-ne
"xv6
\\
nbench
\\
nexit
\\
n"
| nc
$(HW)
.csail.mit.edu 23
...
...
bin/bench.cc
浏览文件 @
ca9a35c1
...
...
@@ -62,34 +62,30 @@ struct TimedExec : public Bench
NEW_OPERATOR
(
TimedExec
)
};
struct
Dirb
ench
:
public
Bench
struct
LoopsB
ench
:
public
Bench
{
Dirbench
()
:
Bench
()
{}
LoopsBench
(
const
char
*
cmd
,
int
nloops
,
int
cpuinc
)
:
Bench
(),
cmd_
(
cmd
),
nloops_
(
nloops
),
cpuinc_
(
cpuinc
)
{}
virtual
void
run
(
void
)
{
#ifdef HW_qemu
int
nloop
=
50
;
#else
int
nloop
=
1000
;
#endif
char
nloopstr
[
16
];
snprintf
(
nloopstr
,
sizeof
(
nloopstr
),
"%u"
,
nloop
);
snprintf
(
nloopstr
,
sizeof
(
nloopstr
),
"%u"
,
nloops_
);
const
char
*
argv
[]
=
{
cmd_
,
0
,
nloopstr
,
0
};
const
char
*
argv
[]
=
{
"/dirbench"
,
0
,
nloopstr
,
0
};
char
*
res
=
result_
;
char
*
q
=
res
+
sizeof
(
result_
);
snprintf
(
res
,
q
-
res
,
"#cores usecs loops/core
\n
"
);
res
+=
strlen
(
res
);
for
(
int
i
=
6
;
i
<=
NCPU
;
i
+=
6
)
{
for
(
int
i
=
cpuinc_
;
i
<=
NCPU
;
i
+=
cpuinc_
)
{
char
cores
[
16
];
snprintf
(
cores
,
sizeof
(
cores
),
"%u"
,
i
);
argv
[
1
]
=
cores
;
u64
r
=
time_this
(
argv
);
// r in usecs
r
=
(
r
*
(
1000
*
1000
))
/
cpuhz
();
snprintf
(
res
,
q
-
res
,
"%u %lu %lu
\n
"
,
i
,
r
,
nloop
);
snprintf
(
res
,
q
-
res
,
"%u %lu %lu
\n
"
,
i
,
r
,
nloop
s_
);
res
+=
strlen
(
res
);
}
}
...
...
@@ -98,9 +94,11 @@ struct Dirbench : public Bench
return
result_
;
}
const
char
*
cmd_
;
int
nloops_
;
int
cpuinc_
;
char
result_
[
1024
];
NEW_OPERATOR
(
Dirbench
)
NEW_OPERATOR
(
LoopsBench
)
};
#define CMD(...) new TimedExec((const char *[]){__VA_ARGS__, 0})
...
...
@@ -113,7 +111,11 @@ main(int ac, char **av)
static
Bench
*
the_bench
[
128
];
int
n
=
0
;
the_bench
[
n
++
]
=
new
Dirbench
();
//the_bench[n++] = new LoopsBench("/dirbench", 1000, 6);
the_bench
[
n
++
]
=
new
LoopsBench
(
"/filebench"
,
100000
,
6
);
//the_bench[n++] = CMD("filebench", "6", "10000");
//the_bench[n++] = CMD("filebench", "48", "10000");
//the_bench[n++] = CMD("forkexecbench");
//the_bench[n++] = CMD("mktree", STR(NCPU), "tree.xdu", "4", "4");
...
...
bin/filebench.cc
浏览文件 @
ca9a35c1
...
...
@@ -44,6 +44,10 @@ bench(int tid, int nloop)
r
=
pread
(
fd
,
chunkbuf
,
CHUNKSZ
,
CHUNKSZ
*
tid
);
if
(
r
!=
CHUNKSZ
)
die
(
"pread"
);
r
=
pwrite
(
fd
,
chunkbuf
,
CHUNKSZ
,
CHUNKSZ
*
tid
);
if
(
r
!=
CHUNKSZ
)
die
(
"pwrite"
);
}
close
(
fd
);
...
...
include/file.hh
浏览文件 @
ca9a35c1
...
...
@@ -16,6 +16,7 @@ struct file : public referenced, public rcu_freed {
int
stat
(
struct
stat
*
);
int
read
(
char
*
addr
,
int
n
);
ssize_t
pread
(
char
*
addr
,
size_t
n
,
off_t
offset
);
ssize_t
pwrite
(
const
char
*
addr
,
size_t
n
,
off_t
offset
);
int
write
(
const
char
*
addr
,
int
n
);
enum
{
FD_NONE
,
FD_PIPE
,
FD_INODE
,
FD_SOCKET
}
type
;
...
...
kernel/file.cc
浏览文件 @
ca9a35c1
...
...
@@ -121,3 +121,29 @@ file::write(const char *addr, int n)
return
netwrite
(
socket
,
addr
,
n
);
panic
(
"filewrite"
);
}
ssize_t
file
::
pwrite
(
const
char
*
addr
,
size_t
n
,
off_t
off
)
{
if
(
type
==
file
::
FD_INODE
){
bool
unlock
;
int
r
;
if
(
ip
->
type
==
0
||
ip
->
type
==
T_DIR
)
panic
(
"filewrite but 0 or T_DIR"
);
unlock
=
false
;
if
(
n
+
off
>
ip
->
size
)
{
ilock
(
ip
,
1
);
unlock
=
true
;
}
r
=
writei
(
ip
,
addr
,
off
,
n
);
if
(
unlock
)
iunlock
(
ip
);
return
r
;
}
return
-
1
;
}
kernel/sysfile.cc
浏览文件 @
ca9a35c1
...
...
@@ -97,6 +97,33 @@ sys_write(int fd, const void *p, size_t n)
}
//SYSCALL
ssize_t
sys_pwrite
(
int
fd
,
const
void
*
ubuf
,
size_t
count
,
off_t
offset
)
{
sref
<
file
>
f
;
if
(
!
getfile
(
fd
,
&
f
))
return
-
1
;
if
(
count
<
PGSIZE
)
{
ssize_t
r
;
char
*
b
;
b
=
kalloc
(
"pwritebuf"
);
fetchmem
(
b
,
ubuf
,
count
);
r
=
f
->
pwrite
(
b
,
count
,
offset
);
kfree
(
b
);
return
r
;
}
else
{
// XXX(sbw) pagefaulting doesn't guarantee ubuf is mapped
// while pread executes
uptr
i
=
(
uptr
)
ubuf
;
for
(
uptr
va
=
PGROUNDDOWN
(
i
);
va
<
i
+
count
;
va
=
va
+
PGSIZE
)
if
(
pagefault
(
myproc
()
->
vmap
,
va
,
0
)
<
0
)
return
-
1
;
return
f
->
pwrite
((
char
*
)
ubuf
,
count
,
offset
);
}
}
//SYSCALL
int
sys_close
(
int
fd
)
{
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论