Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
d678eac0
提交
d678eac0
2月 21, 2012
创建
作者:
Robert Morris
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
hack to farm mmap()s out to wq
上级
22ed1efb
隐藏空白字符变更
内嵌
并排
正在显示
15 个修改的文件
包含
121 行增加
和
10 行删除
+121
-10
Makefrag
bin/Makefrag
+1
-0
scripttest.cc
bin/scripttest.cc
+36
-0
kern_c.h
include/kern_c.h
+1
-0
syscall.h
include/syscall.h
+2
-1
user.h
include/user.h
+1
-0
vm.hh
include/vm.hh
+1
-1
Makefrag
kernel/Makefrag
+1
-0
bootdata.c
kernel/bootdata.c
+1
-0
exec.cc
kernel/exec.cc
+3
-3
proc.cc
kernel/proc.cc
+2
-1
sched.cc
kernel/sched.cc
+1
-1
script.cc
kernel/script.cc
+66
-0
sysproc.cc
kernel/sysproc.cc
+1
-1
vm.cc
kernel/vm.cc
+3
-2
usys.S
lib/usys.S
+1
-0
没有找到文件。
bin/Makefrag
浏览文件 @
d678eac0
...
...
@@ -18,6 +18,7 @@ UPROGS= \
usertests \
lockstat \
preadtest \
scripttest \
ftest \
perf
...
...
bin/scripttest.cc
0 → 100644
浏览文件 @
d678eac0
#include "types.h"
#include "stat.h"
#include "fcntl.h"
#include "user.h"
#include "lib.h"
#include "amd64.h"
#include "ipc.hh"
#include "mmu.h"
int
main
(
int
ac
,
char
**
av
)
{
char
*
p
=
(
char
*
)
PGROUNDUP
((
u64
)(
sbrk
(
0
)
+
0x80000
));
u64
len
=
1000
*
4096
;
u64
chunk
=
128
*
4096
;
// max vmnode size
#if 0
char *q = p;
while(q < p + len){
u64 x = len - (q - p);
if(x > chunk)
x = chunk;
if(map(q, x) < 0){
fprintf(1, "map failed\n");
exit();
}
q += x;
}
#else
script
(
p
,
len
,
chunk
);
#endif
memset
(
p
,
1
,
len
);
exit
();
}
include/kern_c.h
浏览文件 @
d678eac0
...
...
@@ -47,6 +47,7 @@ long sys_listen(int, int);
long
sys_accept
(
int
,
void
*
,
void
*
);
long
sys_pread
(
int
fd
,
void
*
ubuf
,
size_t
count
,
off_t
offset
);
long
sys_async
(
int
,
size_t
,
off_t
,
u32
,
u32
);
long
sys_script
(
void
*
addr
,
u64
len
,
u64
chunk
);
extern
long
(
*
syscalls
[])(
u64
,
u64
,
u64
,
u64
,
u64
,
u64
);
// other exported/imported functions
...
...
include/syscall.h
浏览文件 @
d678eac0
...
...
@@ -29,4 +29,5 @@
#define SYS_accept 28
#define SYS_pread 29
#define SYS_async 30
#define SYS_ncount 31
/* total number of system calls */
#define SYS_script 31
#define SYS_ncount 32
/* total number of system calls */
include/user.h
浏览文件 @
d678eac0
...
...
@@ -29,6 +29,7 @@ int unmap(void *addr, int len);
void
halt
(
void
);
ssize_t
pread
(
int
,
void
*
,
size_t
,
off_t
);
int
async
(
int
,
size_t
,
off_t
,
u32
,
u32
);
int
script
(
void
*
addr
,
u64
len
,
u64
chunk
);
// ulib.c
int
stat
(
char
*
,
struct
stat
*
);
...
...
include/vm.hh
浏览文件 @
d678eac0
...
...
@@ -60,7 +60,7 @@ struct vmap {
void
decref
();
vmap
*
copy
(
int
share
);
vma
*
lookup
(
uptr
start
,
uptr
len
);
int
insert
(
vmnode
*
n
,
uptr
va_start
);
int
insert
(
vmnode
*
n
,
uptr
va_start
,
int
dotlb
);
int
remove
(
uptr
start
,
uptr
len
);
int
pagefault
(
uptr
va
,
u32
err
);
...
...
kernel/Makefrag
浏览文件 @
d678eac0
...
...
@@ -44,6 +44,7 @@ OBJS = \
trap.o \
trapasm.o \
wq.o \
script.o \
incbin.o
OBJS := $(addprefix $(O)/kernel/, $(OBJS))
...
...
kernel/bootdata.c
浏览文件 @
d678eac0
...
...
@@ -78,5 +78,6 @@ long (*syscalls[])(u64, u64, u64, u64, u64, u64) = {
SYSCALL
(
accept
),
SYSCALL
(
pread
),
SYSCALL
(
async
),
SYSCALL
(
script
),
};
kernel/exec.cc
浏览文件 @
d678eac0
...
...
@@ -58,7 +58,7 @@ dosegment(uptr a0, u64 a1)
args
->
ip
,
ph
.
offset
,
ph
.
filesz
))
==
0
)
goto
bad
;
if
(
args
->
vmap
->
insert
(
vmn
,
ph
.
vaddr
)
<
0
)
if
(
args
->
vmap
->
insert
(
vmn
,
ph
.
vaddr
,
1
)
<
0
)
goto
bad
;
prof_end
(
dosegment_prof
);
...
...
@@ -82,7 +82,7 @@ static void dostack(uptr a0, u64 a1)
// Allocate a one-page stack at the top of the (user) address space
if
((
vmn
=
new
vmnode
(
USTACKPAGES
))
==
0
)
goto
bad
;
if
(
args
->
vmap
->
insert
(
vmn
,
USERTOP
-
(
USTACKPAGES
*
PGSIZE
))
<
0
)
if
(
args
->
vmap
->
insert
(
vmn
,
USERTOP
-
(
USTACKPAGES
*
PGSIZE
)
,
1
)
<
0
)
goto
bad
;
vmn
=
0
;
...
...
@@ -133,7 +133,7 @@ static void doheap(uptr a0, u64 a1)
// XXX pre-allocate 32 pages..
if
((
vmn
=
new
vmnode
(
32
))
==
0
)
goto
bad
;
if
(
args
->
vmap
->
insert
(
vmn
,
BRK
)
<
0
)
if
(
args
->
vmap
->
insert
(
vmn
,
BRK
,
1
)
<
0
)
goto
bad
;
vmn
=
0
;
prof_end
(
doheap_prof
);
...
...
kernel/proc.cc
浏览文件 @
d678eac0
...
...
@@ -277,7 +277,7 @@ inituser(void)
vmnode
*
vmn
=
new
vmnode
(
PGROUNDUP
(
_initcode_size
)
/
PGSIZE
);
if
(
vmn
==
0
)
panic
(
"userinit: vmn_allocpg"
);
if
(
p
->
vmap
->
insert
(
vmn
,
0
)
<
0
)
if
(
p
->
vmap
->
insert
(
vmn
,
0
,
1
)
<
0
)
panic
(
"userinit: vmap_insert"
);
if
(
p
->
vmap
->
copyout
(
0
,
_initcode_start
,
_initcode_size
)
<
0
)
panic
(
"userinit: copyout"
);
...
...
@@ -391,6 +391,7 @@ scheduler(void)
if
(
idle
[
mycpu
()
->
id
])
{
int
worked
;
do
{
assert
(
mycpu
()
->
ncli
==
0
);
worked
=
wq_trywork
();
}
while
(
worked
);
sti
();
...
...
kernel/sched.cc
浏览文件 @
d678eac0
...
...
@@ -9,7 +9,7 @@
#include "cpu.hh"
#include "bits.hh"
#include "kmtrace.hh"
#include "sched.h"
#include "sched.h
h
"
#include "vm.hh"
#include <stddef.h>
...
...
kernel/script.cc
0 → 100644
浏览文件 @
d678eac0
#include "types.h"
#include "kernel.hh"
#include "spinlock.h"
#include "condvar.h"
#include "cpu.hh"
#include "proc.hh"
#include "fs.h"
#include "wq.hh"
#include "ipc.hh"
#include "vm.hh"
#include "file.hh"
void
script_mmap_work
(
struct
work
*
w
,
void
*
a0
,
void
*
a1
,
void
*
a2
,
void
*
a3
)
{
void
*
addr
=
(
void
*
)
a0
;
u64
len
=
(
u64
)
a1
;
atomic
<
int
>
*
donep
=
(
atomic
<
int
>
*
)
a2
;
struct
proc
*
p
=
(
struct
proc
*
)
a3
;
vmnode
*
vmn
=
new
vmnode
(
PGROUNDUP
(
len
)
/
PGSIZE
);
if
(
vmn
==
0
)
panic
(
"sys_script: new vmnode"
);
if
(
p
->
vmap
->
insert
(
vmn
,
PGROUNDDOWN
((
u64
)
addr
),
0
)
<
0
)
panic
(
"sys_script: insert"
);
*
donep
+=
1
;
}
long
sys_script
(
void
*
addr
,
u64
len
,
u64
chunk
)
{
atomic
<
int
>
done
;
done
=
0
;
int
queued
=
0
;
char
*
q
=
(
char
*
)
addr
;
while
(
q
<
(
char
*
)
addr
+
len
){
u64
x
=
len
-
(
q
-
(
char
*
)
addr
);
if
(
x
>
chunk
)
x
=
chunk
;
struct
work
*
w
=
allocwork
();
if
(
w
==
0
)
panic
(
"sys_script allocwork"
);
w
->
rip
=
(
void
*
)
script_mmap_work
;
w
->
arg0
=
(
void
*
)
q
;
w
->
arg1
=
(
void
*
)
x
;
w
->
arg2
=
(
void
*
)
&
done
;
w
->
arg3
=
(
void
*
)
myproc
();
if
(
wq_push
(
w
)
<
0
)
panic
(
"sys_script wq_push"
);
queued
++
;
q
+=
chunk
;
}
while
(
done
<
queued
){
// yield();
wq_trywork
();
}
tlbflush
();
return
0
;
}
kernel/sysproc.cc
浏览文件 @
d678eac0
...
...
@@ -111,7 +111,7 @@ sys_map(void)
if
(
vmn
==
0
)
return
-
1
;
if
(
myproc
()
->
vmap
->
insert
(
vmn
,
PGROUNDDOWN
(
addr
))
<
0
)
{
if
(
myproc
()
->
vmap
->
insert
(
vmn
,
PGROUNDDOWN
(
addr
)
,
1
)
<
0
)
{
delete
vmn
;
return
-
1
;
}
...
...
kernel/vm.cc
浏览文件 @
d678eac0
...
...
@@ -275,7 +275,7 @@ vmap::lookup(uptr start, uptr len)
}
int
vmap
::
insert
(
vmnode
*
n
,
uptr
vma_start
)
vmap
::
insert
(
vmnode
*
n
,
uptr
vma_start
,
int
dotlb
)
{
vma
*
e
;
...
...
@@ -309,7 +309,8 @@ vmap::insert(vmnode *n, uptr vma_start)
break
;
}
});
tlbflush
();
if
(
dotlb
)
tlbflush
();
return
0
;
}
...
...
lib/usys.S
浏览文件 @
d678eac0
...
...
@@ -38,3 +38,4 @@ SYSCALL(listen)
SYSCALL(accept)
SYSCALL(pread)
SYSCALL(async)
SYSCALL(script)
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论