Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
nexus-am
提交
064fac47
N
nexus-am
项目概览
OpenXiangShan
/
nexus-am
10 个月 前同步成功
通知
0
Star
21
Fork
25
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
nexus-am
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
064fac47
编写于
3月 07, 2020
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
*-nemu,vme: zero page allocated from OS
上级
81065463
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
26 addition
and
14 deletion
+26
-14
am/src/nemu/isa/mips/vme.c
am/src/nemu/isa/mips/vme.c
+8
-2
am/src/nemu/isa/riscv/vme.c
am/src/nemu/isa/riscv/vme.c
+9
-6
am/src/nemu/isa/x86/vme.c
am/src/nemu/isa/x86/vme.c
+9
-6
未找到文件。
am/src/nemu/isa/mips/vme.c
浏览文件 @
064fac47
...
...
@@ -8,6 +8,12 @@ static void* (*pgalloc_usr)(size_t) = NULL;
static
void
(
*
pgfree_usr
)(
void
*
)
=
NULL
;
static
int
vme_enable
=
0
;
static
inline
void
*
new_page
()
{
void
*
p
=
pgalloc_usr
(
PGSIZE
);
memset
(
p
,
0
,
PGSIZE
);
return
p
;
}
int
_vme_init
(
void
*
(
*
pgalloc_f
)(
size_t
),
void
(
*
pgfree_f
)(
void
*
))
{
pgalloc_usr
=
pgalloc_f
;
pgfree_usr
=
pgfree_f
;
...
...
@@ -17,7 +23,7 @@ int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
}
void
_protect
(
_AddressSpace
*
as
)
{
as
->
ptr
=
(
PTE
*
)(
pgalloc_usr
(
PGSIZE
)
);
as
->
ptr
=
new_page
(
);
as
->
pgsize
=
PGSIZE
;
as
->
area
=
USER_SPACE
;
}
...
...
@@ -46,7 +52,7 @@ void _map(_AddressSpace *as, void *va, void *pa, int prot) {
PTE
*
pdir
=
(
PTE
*
)
as
->
ptr
;
PTE
*
pde
=
&
pdir
[
PDX
(
va
)];
if
(
!
(
*
pde
&
PTE_V
))
{
*
pde
=
PTE_V
|
(
uint
32_t
)
pgalloc_usr
(
PGSIZE
);
*
pde
=
PTE_V
|
(
uint
ptr_t
)
new_page
(
);
}
PTE
*
pte
=
&
((
PTE
*
)
PTE_ADDR
(
*
pde
))[
PTX
(
va
)];
if
(
!
(
*
pte
&
PTE_V
))
{
...
...
am/src/nemu/isa/riscv/vme.c
浏览文件 @
064fac47
...
...
@@ -46,14 +46,17 @@ static inline uintptr_t get_satp() {
return
satp
<<
12
;
// the mode bits will be shifted out
}
static
inline
void
*
new_page
()
{
void
*
p
=
pgalloc_usr
(
PGSIZE
);
memset
(
p
,
0
,
PGSIZE
);
return
p
;
}
int
_vme_init
(
void
*
(
*
pgalloc_f
)(
size_t
),
void
(
*
pgfree_f
)(
void
*
))
{
pgalloc_usr
=
pgalloc_f
;
pgfree_usr
=
pgfree_f
;
kas
.
ptr
=
pgalloc_f
(
PGSIZE
);
// make all PTEs invalid
memset
(
kas
.
ptr
,
0
,
PGSIZE
);
kas
.
ptr
=
new_page
();
int
i
;
for
(
i
=
0
;
i
<
LENGTH
(
segments
);
i
++
)
{
void
*
va
=
segments
[
i
].
start
;
...
...
@@ -69,7 +72,7 @@ int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
}
void
_protect
(
_AddressSpace
*
as
)
{
PTE
*
updir
=
(
PTE
*
)(
pgalloc_usr
(
PGSIZE
)
);
PTE
*
updir
=
new_page
(
);
as
->
ptr
=
updir
;
as
->
area
=
USER_SPACE
;
as
->
pgsize
=
PGSIZE
;
...
...
@@ -101,7 +104,7 @@ void _map(_AddressSpace *as, void *va, void *pa, int prot) {
pg_base
=
(
PTE
*
)
PTE_ADDR
(
*
pte
);
if
(
level
==
0
)
break
;
if
(
!
(
*
pte
&
PTE_V
))
{
pg_base
=
pgalloc_usr
(
PGSIZE
);
pg_base
=
new_page
(
);
*
pte
=
PTE_V
|
(
PN
(
pg_base
)
<<
10
);
}
}
...
...
am/src/nemu/isa/x86/vme.c
浏览文件 @
064fac47
...
...
@@ -15,14 +15,17 @@ static _Area segments[] = { // Kernel memory mappings
#define USER_SPACE RANGE(0x40000000, 0xc0000000)
static
inline
void
*
new_page
()
{
void
*
p
=
pgalloc_usr
(
PGSIZE
);
memset
(
p
,
0
,
PGSIZE
);
return
p
;
}
int
_vme_init
(
void
*
(
*
pgalloc_f
)(
size_t
),
void
(
*
pgfree_f
)(
void
*
))
{
pgalloc_usr
=
pgalloc_f
;
pgfree_usr
=
pgfree_f
;
kas
.
ptr
=
pgalloc_f
(
PGSIZE
);
// make all PTEs invalid
memset
(
kas
.
ptr
,
0
,
PGSIZE
);
kas
.
ptr
=
new_page
();
int
i
;
for
(
i
=
0
;
i
<
LENGTH
(
segments
);
i
++
)
{
void
*
va
=
segments
[
i
].
start
;
...
...
@@ -39,7 +42,7 @@ int _vme_init(void* (*pgalloc_f)(size_t), void (*pgfree_f)(void*)) {
}
void
_protect
(
_AddressSpace
*
as
)
{
PTE
*
updir
=
(
PTE
*
)(
pgalloc_usr
(
PGSIZE
)
);
PTE
*
updir
=
new_page
(
);
as
->
ptr
=
updir
;
as
->
area
=
USER_SPACE
;
as
->
pgsize
=
PGSIZE
;
...
...
@@ -71,7 +74,7 @@ void _map(_AddressSpace *as, void *va, void *pa, int prot) {
pg_base
=
(
PTE
*
)
PTE_ADDR
(
*
pte
);
if
(
level
==
0
)
break
;
if
(
!
(
*
pte
&
PTE_P
))
{
pg_base
=
pgalloc_usr
(
PGSIZE
);
pg_base
=
new_page
(
);
*
pte
=
PTE_P
|
PTE_W
|
PTE_U
|
(
uintptr_t
)
pg_base
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录