Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
e2c6563b
提交
e2c6563b
4月 04, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Change sys_sleep to sys_nsleep and related rejiggering
上级
72c2fe95
隐藏空白字符变更
内嵌
并排
正在显示
13 个修改的文件
包含
47 行增加
和
49 行删除
+47
-49
sleep.cc
bin/sleep.cc
+3
-2
usertests.cc
bin/usertests.cc
+3
-3
kern_c.h
include/kern_c.h
+1
-1
kernel.hh
include/kernel.hh
+2
-5
syscall.h
include/syscall.h
+1
-1
user.h
include/user.h
+1
-1
bootdata.c
kernel/bootdata.c
+1
-1
condvar.cc
kernel/condvar.cc
+9
-7
hz.cc
kernel/hz.cc
+0
-7
rnd.cc
kernel/rnd.cc
+4
-2
sysproc.cc
kernel/sysproc.cc
+20
-17
trap.cc
kernel/trap.cc
+1
-1
usys.S
lib/usys.S
+1
-1
没有找到文件。
bin/sleep.cc
浏览文件 @
e2c6563b
...
...
@@ -8,10 +8,11 @@ int
main
(
int
ac
,
char
*
av
[])
{
if
(
ac
!=
2
)
{
fprintf
(
1
,
"Usage: %s
tick
s
\n
"
,
av
[
0
]);
fprintf
(
1
,
"Usage: %s
second
s
\n
"
,
av
[
0
]);
exit
();
}
sleep
(
atoi
(
av
[
1
]));
u64
x
=
atoi
(
av
[
1
])
*
1000000000ull
;
nsleep
(
x
);
exit
();
}
bin/usertests.cc
浏览文件 @
e2c6563b
...
...
@@ -1372,7 +1372,7 @@ sbrktest(void)
sbrk
((
632
*
1024
)
-
(
uptr
)
sbrk
(
0
));
write
(
fds
[
1
],
"x"
,
1
);
// sit around until killed
for
(;;)
sleep
(
1000
);
for
(;;)
nsleep
(
1000000000ull
);
}
if
(
pids
[
i
]
!=
-
1
)
read
(
fds
[
0
],
&
scratch
,
1
);
...
...
@@ -1416,8 +1416,8 @@ validatetest(void)
fprintf
(
stdout
,
"validatetest failed (pipe succeeded)
\n
"
);
exit
();
}
sleep
(
0
);
sleep
(
0
);
n
sleep
(
0
);
n
sleep
(
0
);
kill
(
pid
);
wait
();
...
...
include/kern_c.h
浏览文件 @
e2c6563b
...
...
@@ -35,7 +35,7 @@ long sys_openat(int, const char*, int);
long
sys_pipe
(
int
*
);
long
sys_read
(
int
,
char
*
,
int
);
long
sys_sbrk
(
int
);
long
sys_
sleep
(
int
);
long
sys_
nsleep
(
u64
);
long
sys_unlink
(
const
char
*
);
long
sys_wait
(
void
);
long
sys_write
(
int
,
char
*
,
int
);
...
...
include/kernel.hh
浏览文件 @
e2c6563b
...
...
@@ -51,15 +51,13 @@ void bwrite(struct buf*);
void
cgaputc
(
int
c
);
// condvar.c
extern
u64
ticks
;
extern
struct
spinlock
tickslock
;
extern
struct
condvar
cv_ticks
;
void
initcondvar
(
struct
condvar
*
,
const
char
*
);
void
destroycondvar
(
struct
condvar
*
);
void
cv_sleep
(
struct
condvar
*
cv
,
struct
spinlock
*
);
void
cv_sleepto
(
struct
condvar
*
cv
,
struct
spinlock
*
,
u64
);
void
cv_wakeup
(
struct
condvar
*
cv
);
void
cv_tick
(
void
);
void
timerintr
(
void
);
u64
nsectime
(
void
);
// console.c
void
cprintf
(
const
char
*
,
...)
__attribute__
((
format
(
printf
,
1
,
2
)));
...
...
@@ -106,7 +104,6 @@ void dir_flush(struct inode *dp);
// hz.c
void
microdelay
(
u64
);
u64
nsectime
(
void
);
void
inithz
(
void
);
// ide.c
...
...
include/syscall.h
浏览文件 @
e2c6563b
...
...
@@ -18,7 +18,7 @@
#define SYS_dup 17
#define SYS_getpid 18
#define SYS_sbrk 19
#define SYS_
sleep
20
#define SYS_
nsleep
20
#define SYS_uptime 21
#define SYS_map 22
#define SYS_unmap 23
...
...
include/user.h
浏览文件 @
e2c6563b
...
...
@@ -25,7 +25,7 @@ int chdir(const char*);
int
dup
(
int
);
int
getpid
(
void
);
char
*
sbrk
(
int
);
int
sleep
(
int
);
int
nsleep
(
u64
);
int
uptime
(
void
);
int
map
(
void
*
addr
,
int
len
);
int
unmap
(
void
*
addr
,
int
len
);
...
...
kernel/bootdata.c
浏览文件 @
e2c6563b
...
...
@@ -45,7 +45,7 @@ long (*syscalls[])(u64, u64, u64, u64, u64) = {
SYSCALL
(
pipe
),
SYSCALL
(
read
),
SYSCALL
(
sbrk
),
SYSCALL
(
sleep
),
SYSCALL
(
n
sleep
),
SYSCALL
(
unlink
),
SYSCALL
(
wait
),
SYSCALL
(
write
),
...
...
kernel/condvar.cc
浏览文件 @
e2c6563b
...
...
@@ -8,9 +8,7 @@
#include "proc.hh"
#include "cpu.hh"
struct
spinlock
tickslock
__mpalign__
;
struct
condvar
cv_ticks
__mpalign__
;
u64
ticks
__mpalign__
;
static
u64
ticks
__mpalign__
;
LIST_HEAD
(
sleepers
,
proc
)
sleepers
__mpalign__
;
struct
spinlock
sleepers_lock
;
...
...
@@ -23,18 +21,22 @@ wakeup(struct proc *p)
addrun
(
p
);
}
u64
nsectime
(
void
)
{
u64
msec
=
ticks
*
QUANTUM
;
return
msec
*
1000000
;
}
void
cv_tick
(
void
)
timerintr
(
void
)
{
struct
proc
*
p
,
*
tmp
;
struct
condvar
*
cv
;
int
again
;
u64
now
;
acquire
(
&
tickslock
);
ticks
++
;
cv_wakeup
(
&
cv_ticks
);
release
(
&
tickslock
);
now
=
nsectime
();
again
=
0
;
...
...
kernel/hz.cc
浏览文件 @
e2c6563b
...
...
@@ -26,13 +26,6 @@ microdelay(u64 delay)
nop_pause
();
}
u64
nsectime
(
void
)
{
u64
msec
=
ticks
*
QUANTUM
;
return
msec
*
1000000
;
}
void
inithz
(
void
)
{
...
...
kernel/rnd.cc
浏览文件 @
e2c6563b
#include "crange_arch.hh"
#include "types.h"
#include "amd64.h"
#include "cpu.hh"
#include "rnd.hh"
struct
seed
{
...
...
@@ -10,7 +12,7 @@ u64
rnd
(
void
)
{
if
(
seeds
[
mycpu
()
->
id
].
v
==
0
)
{
seeds
[
mycpu
()
->
id
].
v
=
ticks
;
seeds
[
mycpu
()
->
id
].
v
=
rdtsc
()
;
}
seeds
[
mycpu
()
->
id
].
v
=
seeds
[
mycpu
()
->
id
].
v
*
6364136223846793005
+
1442695040888963407
;
...
...
kernel/sysproc.cc
浏览文件 @
e2c6563b
...
...
@@ -55,20 +55,28 @@ sys_sbrk(int n)
}
long
sys_
sleep
(
int
n
)
sys_
nsleep
(
u64
nsec
)
{
u32
ticks0
;
acquire
(
&
tickslock
);
ticks0
=
ticks
;
while
(
ticks
-
ticks0
<
n
){
if
(
myproc
()
->
killed
){
release
(
&
tickslock
);
struct
spinlock
lock
;
struct
condvar
cv
;
u64
nsecto
;
initlock
(
&
lock
,
"sleep_lock"
,
0
);
initcondvar
(
&
cv
,
"sleep_cv"
);
acquire
(
&
lock
);
auto
cleanup
=
scoped_cleanup
([
&
lock
,
&
cv
]()
{
release
(
&
lock
);
destroycondvar
(
&
cv
);
destroylock
(
&
lock
);
});
nsecto
=
nsectime
()
+
nsec
;
while
(
nsecto
>
nsectime
())
{
if
(
myproc
()
->
killed
)
return
-
1
;
}
cv_sleep
(
&
cv_ticks
,
&
tickslock
);
cv_sleepto
(
&
cv
,
&
lock
,
nsecto
);
}
release
(
&
tickslock
);
return
0
;
}
...
...
@@ -77,12 +85,7 @@ sys_sleep(int n)
long
sys_uptime
(
void
)
{
u64
xticks
;
acquire
(
&
tickslock
);
xticks
=
ticks
;
release
(
&
tickslock
);
return
xticks
;
return
nsectime
();
}
long
...
...
kernel/trap.cc
浏览文件 @
e2c6563b
...
...
@@ -127,7 +127,7 @@ trap(struct trapframe *tf)
mycpu
()
->
timer_printpc
=
0
;
}
if
(
mycpu
()
->
id
==
0
)
cv_tick
();
timerintr
();
lapiceoi
();
break
;
case
T_IRQ0
+
IRQ_IDE
:
...
...
lib/usys.S
浏览文件 @
e2c6563b
...
...
@@ -35,7 +35,7 @@ SYSCALL(chdir)
SYSCALL(dup)
SYSCALL(getpid)
SYSCALL(sbrk)
SYSCALL(sleep)
SYSCALL(
n
sleep)
SYSCALL(uptime)
SYSCALL(map)
SYSCALL(unmap)
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论