Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
70e01816
提交
70e01816
1月 03, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
A device file that exports profiling samples.
上级
e65d0098
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
96 行增加
和
14 行删除
+96
-14
file.h
file.h
+1
-0
init.c
init.c
+2
-0
sampler.c
sampler.c
+82
-14
sampler.h
sampler.h
+11
-0
没有找到文件。
file.h
浏览文件 @
70e01816
...
@@ -50,3 +50,4 @@ extern struct devsw devsw[];
...
@@ -50,3 +50,4 @@ extern struct devsw devsw[];
#define CONSOLE 1
#define CONSOLE 1
#define NETIF 2
#define NETIF 2
#define SAMPLER 3
init.c
浏览文件 @
70e01816
...
@@ -21,6 +21,8 @@ main(void)
...
@@ -21,6 +21,8 @@ main(void)
if
(
mknod
(
"netif"
,
2
,
1
)
<
0
)
if
(
mknod
(
"netif"
,
2
,
1
)
<
0
)
printf
(
2
,
"init: mknod netif failed
\n
"
);
printf
(
2
,
"init: mknod netif failed
\n
"
);
if
(
mknod
(
"sampler"
,
3
,
1
)
<
0
)
printf
(
2
,
"init: mknod netif failed
\n
"
);
for
(;;){
for
(;;){
printf
(
1
,
"init: starting sh
\n
"
);
printf
(
1
,
"init: starting sh
\n
"
);
...
...
sampler.c
浏览文件 @
70e01816
...
@@ -8,6 +8,7 @@
...
@@ -8,6 +8,7 @@
#include "bits.h"
#include "bits.h"
#include "amd64.h"
#include "amd64.h"
#include "cpu.h"
#include "cpu.h"
#include "sampler.h"
static
const
u64
debug_sel
=
static
const
u64
debug_sel
=
0UL
<<
32
|
0UL
<<
32
|
...
@@ -27,14 +28,9 @@ struct pmu {
...
@@ -27,14 +28,9 @@ struct pmu {
};
};
struct
pmu
pmu
;
struct
pmu
pmu
;
struct
pmuevent
{
u64
rip
;
};
struct
pmulog
{
struct
pmulog
{
u64
head
;
u64
count
;
u64
tail
;
u64
capacity
;
u64
size
;
struct
pmuevent
*
event
;
struct
pmuevent
*
event
;
__padout__
;
__padout__
;
}
__mpalign__
;
}
__mpalign__
;
...
@@ -79,9 +75,9 @@ sampdump(void)
...
@@ -79,9 +75,9 @@ sampdump(void)
{
{
for
(
int
c
=
0
;
c
<
NCPU
;
c
++
)
{
for
(
int
c
=
0
;
c
<
NCPU
;
c
++
)
{
struct
pmulog
*
l
=
&
pmulog
[
c
];
struct
pmulog
*
l
=
&
pmulog
[
c
];
cprintf
(
"%u samples %lu
\n
"
,
c
,
l
->
head
-
l
->
tail
);
cprintf
(
"%u samples %lu
\n
"
,
c
,
l
->
count
);
for
(
u64
i
=
l
->
tail
;
i
<
l
->
tail
+
4
&&
i
<
l
->
head
;
i
++
)
for
(
u64
i
=
0
;
i
<
4
&&
i
<
l
->
count
;
i
++
)
cprintf
(
" %lx
\n
"
,
l
->
event
[
i
%
l
->
size
].
rip
);
cprintf
(
" %lx
\n
"
,
l
->
event
[
i
].
rip
);
}
}
}
}
...
@@ -111,11 +107,11 @@ samplog(struct trapframe *tf)
...
@@ -111,11 +107,11 @@ samplog(struct trapframe *tf)
struct
pmulog
*
l
;
struct
pmulog
*
l
;
l
=
&
pmulog
[
cpunum
()];
l
=
&
pmulog
[
cpunum
()];
if
(
(
l
->
head
-
l
->
tail
)
==
l
->
size
)
if
(
l
->
count
==
l
->
capacity
)
return
0
;
return
0
;
l
->
event
[
l
->
head
%
l
->
size
].
rip
=
tf
->
rip
;
l
->
event
[
l
->
count
].
rip
=
tf
->
rip
;
l
->
head
++
;
l
->
count
++
;
return
1
;
return
1
;
}
}
...
@@ -139,6 +135,75 @@ sampintr(struct trapframe *tf)
...
@@ -139,6 +135,75 @@ sampintr(struct trapframe *tf)
return
1
;
return
1
;
}
}
static
int
readlog
(
char
*
dst
,
u32
off
,
u32
n
)
{
struct
pmulog
*
q
=
&
pmulog
[
NCPU
];
struct
pmulog
*
p
;
int
ret
=
0
;
u64
cur
=
0
;
for
(
p
=
&
pmulog
[
0
];
p
!=
q
&&
n
!=
0
;
p
++
)
{
u64
len
=
p
->
count
*
sizeof
(
struct
pmuevent
);
char
*
buf
=
(
char
*
)
p
->
event
;
if
(
cur
<=
off
&&
off
<
cur
+
len
)
{
u64
boff
=
off
-
cur
;
u64
cc
=
MIN
(
len
-
boff
,
n
);
memmove
(
dst
,
buf
+
boff
,
cc
);
n
-=
cc
;
ret
+=
cc
;
off
+=
cc
;
dst
+=
cc
;
}
cur
+=
len
;
}
return
ret
;
}
static
int
sampread
(
struct
inode
*
ip
,
char
*
dst
,
u32
off
,
u32
n
)
{
struct
pmulog
*
q
=
&
pmulog
[
NCPU
];
struct
pmulog
*
p
;
struct
logheader
*
hdr
;
u64
hdrlen
;
int
ret
;
int
i
;
ret
=
0
;
hdrlen
=
sizeof
(
*
hdr
)
+
sizeof
(
hdr
->
cpu
[
0
])
*
NCPU
;
if
(
off
<
hdrlen
)
{
u64
len
=
hdrlen
;
u64
cc
;
hdr
=
kmalloc
(
len
);
if
(
hdr
==
NULL
)
return
-
1
;
hdr
->
ncpus
=
NCPU
;
for
(
p
=
&
pmulog
[
0
];
p
!=
q
;
p
++
)
{
u64
sz
=
p
->
count
*
sizeof
(
struct
pmuevent
);
hdr
->
cpu
[
i
].
offset
=
len
;
hdr
->
cpu
[
i
].
size
=
sz
;
len
+=
sz
;
}
cc
=
MIN
(
hdrlen
-
off
,
n
);
memmove
(
dst
,
(
void
*
)
hdr
+
off
,
cc
);
kmfree
(
hdr
);
n
-=
cc
;
ret
+=
cc
;
off
+=
cc
;
dst
+=
cc
;
}
if
(
off
>
hdrlen
)
ret
+=
readlog
(
dst
,
off
-
hdrlen
,
n
);
return
ret
;
}
void
void
initsamp
(
void
)
initsamp
(
void
)
{
{
...
@@ -165,5 +230,8 @@ initsamp(void)
...
@@ -165,5 +230,8 @@ initsamp(void)
if
(
p
==
NULL
)
if
(
p
==
NULL
)
panic
(
"initprof: ksalloc"
);
panic
(
"initprof: ksalloc"
);
pmulog
[
cpunum
()].
event
=
p
;
pmulog
[
cpunum
()].
event
=
p
;
pmulog
[
cpunum
()].
size
=
PERFSIZE
/
sizeof
(
struct
pmuevent
);
pmulog
[
cpunum
()].
capacity
=
PERFSIZE
/
sizeof
(
struct
pmuevent
);
devsw
[
SAMPLER
].
write
=
NULL
;
devsw
[
SAMPLER
].
read
=
sampread
;
}
}
sampler.h
0 → 100644
浏览文件 @
70e01816
struct
pmuevent
{
u64
rip
;
};
struct
logheader
{
u32
ncpus
;
struct
{
u64
offset
;
u64
size
;
}
cpu
[];
};
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论