Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
eb18645f
提交
eb18645f
8月 05, 2010
创建
作者:
Robert Morris
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix allocuvm() to handle sbrk() with non-page-granularity argument
(maybe this never worked, but it works now)
上级
b738a4f1
显示空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
63 行增加
和
11 行删除
+63
-11
Makefile
Makefile
+1
-1
defs.h
defs.h
+0
-2
mmu.h
mmu.h
+4
-0
usertests.c
usertests.c
+34
-0
vm.c
vm.c
+24
-8
没有找到文件。
Makefile
浏览文件 @
eb18645f
...
@@ -38,7 +38,7 @@ AS = $(TOOLPREFIX)gas
...
@@ -38,7 +38,7 @@ AS = $(TOOLPREFIX)gas
LD
=
$(TOOLPREFIX)
ld
LD
=
$(TOOLPREFIX)
ld
OBJCOPY
=
$(TOOLPREFIX)
objcopy
OBJCOPY
=
$(TOOLPREFIX)
objcopy
OBJDUMP
=
$(TOOLPREFIX)
objdump
OBJDUMP
=
$(TOOLPREFIX)
objdump
CFLAGS
=
-fno-pic
-static
-fno-builtin
-fno-strict-aliasing
-O2
-Wall
-MD
-ggdb
-m32
CFLAGS
=
-fno-pic
-static
-fno-builtin
-fno-strict-aliasing
-O2
-Wall
-MD
-ggdb
-m32
-Werror
CFLAGS
+=
$(
shell
$(CC)
-fno-stack-protector
-E
-x
c /dev/null
>
/dev/null 2>&1
&&
echo
-fno-stack-protector
)
CFLAGS
+=
$(
shell
$(CC)
-fno-stack-protector
-E
-x
c /dev/null
>
/dev/null 2>&1
&&
echo
-fno-stack-protector
)
ASFLAGS
=
-m32
-gdwarf-2
ASFLAGS
=
-m32
-gdwarf-2
# FreeBSD ld wants ``elf_i386_fbsd''
# FreeBSD ld wants ``elf_i386_fbsd''
...
...
defs.h
浏览文件 @
eb18645f
...
@@ -153,8 +153,6 @@ void uartintr(void);
...
@@ -153,8 +153,6 @@ void uartintr(void);
void
uartputc
(
int
);
void
uartputc
(
int
);
// vm.c
// vm.c
#define PGROUNDUP(sz) ((sz+PGSIZE-1) & ~(PGSIZE-1))
extern
pde_t
*
kpgdir
;
void
pminit
(
void
);
void
pminit
(
void
);
void
ksegment
(
void
);
void
ksegment
(
void
);
void
kvmalloc
(
void
);
void
kvmalloc
(
void
);
...
...
mmu.h
浏览文件 @
eb18645f
...
@@ -126,6 +126,9 @@ struct segdesc {
...
@@ -126,6 +126,9 @@ struct segdesc {
#define PTXSHIFT 12 // offset of PTX in a linear address
#define PTXSHIFT 12 // offset of PTX in a linear address
#define PDXSHIFT 22 // offset of PDX in a linear address
#define PDXSHIFT 22 // offset of PDX in a linear address
#define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1))
#define PGROUNDDOWN(a) ((char*)((((unsigned int)a) & ~(PGSIZE-1))))
// Page table/directory entry flags.
// Page table/directory entry flags.
#define PTE_P 0x001 // Present
#define PTE_P 0x001 // Present
#define PTE_W 0x002 // Writeable
#define PTE_W 0x002 // Writeable
...
@@ -148,6 +151,7 @@ struct segdesc {
...
@@ -148,6 +151,7 @@ struct segdesc {
#define PTE_ADDR(pte) ((uint) (pte) & ~0xFFF)
#define PTE_ADDR(pte) ((uint) (pte) & ~0xFFF)
typedef
uint
pte_t
;
typedef
uint
pte_t
;
extern
pde_t
*
kpgdir
;
// Control Register flags
// Control Register flags
#define CR0_PE 0x00000001 // Protection Enable
#define CR0_PE 0x00000001 // Protection Enable
...
...
usertests.c
浏览文件 @
eb18645f
...
@@ -1229,6 +1229,38 @@ forktest(void)
...
@@ -1229,6 +1229,38 @@ forktest(void)
printf
(
1
,
"fork test OK
\n
"
);
printf
(
1
,
"fork test OK
\n
"
);
}
}
void
sbrktest
(
void
)
{
printf
(
stdout
,
"sbrk test
\n
"
);
char
*
a
=
sbrk
(
0
);
int
i
;
for
(
i
=
0
;
i
<
5000
;
i
++
){
char
*
b
=
sbrk
(
1
);
if
(
b
!=
a
){
printf
(
stdout
,
"sbrk test failed %d %x %x
\n
"
,
i
,
a
,
b
);
exit
();
}
*
b
=
1
;
a
=
b
+
1
;
}
int
pid
=
fork
();
if
(
pid
<
0
){
printf
(
stdout
,
"sbrk test fork failed
\n
"
);
exit
();
}
char
*
c
=
sbrk
(
1
);
c
=
sbrk
(
1
);
if
(
c
!=
a
+
1
){
printf
(
stdout
,
"sbrk test failed post-fork
\n
"
);
exit
();
}
if
(
pid
==
0
)
exit
();
wait
();
printf
(
stdout
,
"sbrk test OK
\n
"
);
}
int
int
main
(
int
argc
,
char
*
argv
[])
main
(
int
argc
,
char
*
argv
[])
{
{
...
@@ -1240,6 +1272,8 @@ main(int argc, char *argv[])
...
@@ -1240,6 +1272,8 @@ main(int argc, char *argv[])
}
}
close
(
open
(
"usertests.ran"
,
O_CREATE
));
close
(
open
(
"usertests.ran"
,
O_CREATE
));
sbrktest
();
opentest
();
opentest
();
writetest
();
writetest
();
writetest1
();
writetest1
();
...
...
vm.c
浏览文件 @
eb18645f
...
@@ -54,6 +54,9 @@ printpgdir(pde_t *pgdir)
...
@@ -54,6 +54,9 @@ printpgdir(pde_t *pgdir)
cprintf
(
"printpgdir done
\n
"
,
pgdir
);
cprintf
(
"printpgdir done
\n
"
,
pgdir
);
}
}
// return the address of the PTE in page table pgdir
// that corresponds to linear address va. if create!=0,
// create any required page table pages.
static
pte_t
*
static
pte_t
*
walkpgdir
(
pde_t
*
pgdir
,
const
void
*
va
,
int
create
)
walkpgdir
(
pde_t
*
pgdir
,
const
void
*
va
,
int
create
)
{
{
...
@@ -80,6 +83,8 @@ walkpgdir(pde_t *pgdir, const void *va, int create)
...
@@ -80,6 +83,8 @@ walkpgdir(pde_t *pgdir, const void *va, int create)
return
&
pgtab
[
PTX
(
va
)];
return
&
pgtab
[
PTX
(
va
)];
}
}
// create PTEs for linear addresses starting at la that refer to
// physical addresses starting at pa.
static
int
static
int
mappages
(
pde_t
*
pgdir
,
void
*
la
,
uint
size
,
uint
pa
,
int
perm
)
mappages
(
pde_t
*
pgdir
,
void
*
la
,
uint
size
,
uint
pa
,
int
perm
)
{
{
...
@@ -89,6 +94,8 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm)
...
@@ -89,6 +94,8 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm)
for
(
i
=
0
;
i
<
size
;
i
+=
PGSIZE
)
{
for
(
i
=
0
;
i
<
size
;
i
+=
PGSIZE
)
{
if
(
!
(
pte
=
walkpgdir
(
pgdir
,
(
void
*
)(
la
+
i
),
1
)))
if
(
!
(
pte
=
walkpgdir
(
pgdir
,
(
void
*
)(
la
+
i
),
1
)))
return
0
;
return
0
;
if
(
*
pte
&
PTE_P
)
panic
(
"remap"
);
*
pte
=
(
pa
+
i
)
|
perm
|
PTE_P
;
*
pte
=
(
pa
+
i
)
|
perm
|
PTE_P
;
}
}
return
1
;
return
1
;
...
@@ -177,21 +184,30 @@ uva2ka(pde_t *pgdir, char *uva)
...
@@ -177,21 +184,30 @@ uva2ka(pde_t *pgdir, char *uva)
return
(
char
*
)
pa
;
return
(
char
*
)
pa
;
}
}
// allocate sz bytes more memory for a process starting at the
// given user address; allocates physical memory and page
// table entries. addr and sz need not be page-aligned.
// it is a no-op for any parts of the requested memory
// that are already allocated.
int
int
allocuvm
(
pde_t
*
pgdir
,
char
*
addr
,
uint
sz
)
allocuvm
(
pde_t
*
pgdir
,
char
*
addr
,
uint
sz
)
{
{
uint
i
,
n
;
if
(
addr
+
sz
>=
(
char
*
)
USERTOP
)
char
*
mem
;
n
=
PGROUNDUP
(
sz
);
if
(
addr
+
n
>=
USERTOP
)
return
0
;
return
0
;
for
(
i
=
0
;
i
<
n
;
i
+=
PGSIZE
)
{
char
*
start
=
PGROUNDDOWN
(
addr
);
if
(
!
(
mem
=
kalloc
(
PGSIZE
)))
{
// XXX cleanup what we did?
char
*
last
=
PGROUNDDOWN
(
addr
+
sz
-
1
);
char
*
a
;
for
(
a
=
start
;
a
<=
last
;
a
+=
PGSIZE
){
pte_t
*
pte
=
walkpgdir
(
pgdir
,
a
,
0
);
if
(
pte
==
0
||
(
*
pte
&
PTE_P
)
==
0
){
char
*
mem
=
kalloc
(
PGSIZE
);
if
(
mem
==
0
){
// XXX clean up?
return
0
;
return
0
;
}
}
memset
(
mem
,
0
,
PGSIZE
);
memset
(
mem
,
0
,
PGSIZE
);
mappages
(
pgdir
,
addr
+
i
,
PGSIZE
,
PADDR
(
mem
),
PTE_W
|
PTE_U
);
mappages
(
pgdir
,
a
,
PGSIZE
,
PADDR
(
mem
),
PTE_W
|
PTE_U
);
}
}
}
return
1
;
return
1
;
}
}
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论