Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
36f95831
提交
36f95831
10月 25, 2011
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Clean up amd64 page table code.
上级
ccb4db66
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
35 行增加
和
57 行删除
+35
-57
mmu.h
mmu.h
+2
-16
types.h
types.h
+2
-4
vm.c
vm.c
+31
-37
没有找到文件。
mmu.h
浏览文件 @
36f95831
...
...
@@ -3,22 +3,8 @@
#define PGSIZE 4096
#define PGSHIFT 12 // log2(PGSIZE)
#define PTXSHIFT 12 // offset of PTX in a linear address
#define PDXSHIFT 21 // offset of PDX in a linear address
#define PDPXSHIFT 30 // offset of PDPX in a linear address
#define PML4XSHIFT 39 // offset of PML4X in a linear address
// page table index
#define PTX(la) (((uptr)(la) >> PTXSHIFT) & 0x1FF)
// page directory index
#define PDX(la) (((uptr)(la) >> PDXSHIFT) & 0x1FF)
// page diretory pointer index
#define PDPX(la) (((uptr)(la) >> PDPXSHIFT) & 0x1FF)
// page map level 4 index
#define PML4X(la) (((uptr)(la) >> PML4XSHIFT) & 0x1FF)
#define PXSHIFT(n) (PGSHIFT+(9*(n)))
#define PX(n, la) ((((uptr) (la)) >> PXSHIFT(n)) & 0x1FF)
// Page table/directory entry flags.
#define PTE_P 0x001 // Present
...
...
types.h
浏览文件 @
36f95831
...
...
@@ -13,9 +13,7 @@ typedef uint64 u64;
typedef
uint64
uptr
;
typedef
uptr
paddr
;
typedef
u64
pml4e_t
;
typedef
u64
pdpe_t
;
typedef
u64
pde_t
;
typedef
u64
pte_t
;
typedef
u64
pme_t
;
// Page Map Entry (refers to any entry in any level)
typedef
pme_t
pml4e_t
;
#define __mpalign__ __attribute__((aligned(CACHELINE)))
vm.c
浏览文件 @
36f95831
...
...
@@ -19,46 +19,40 @@ extern pml4e_t kpml4[];
extern
char
*
pgalloc
(
void
);
static
pme_t
*
descend
(
pme_t
*
dir
,
void
*
va
,
u64
flags
,
int
create
,
int
level
)
{
pme_t
entry
;
pme_t
*
next
;
dir
=
&
dir
[
PX
(
level
,
va
)];
entry
=
*
dir
;
if
(
entry
==
0
)
{
if
(
!
create
)
return
NULL
;
next
=
(
u64
*
)
pgalloc
();
if
(
!
next
)
return
NULL
;
*
dir
=
v2p
(
next
)
|
PTE_P
|
PTE_W
|
flags
;
}
else
{
next
=
p2v
(
PTE_ADDR
(
entry
));
}
return
next
;
}
static
void
pgmap
(
void
*
va
,
void
*
last
,
paddr
pa
)
{
pml4e_t
*
pml4
;
pml4e_t
pml4e
;
pdpe_t
*
pdp
;
pdpe_t
pdpe
;
pde_t
*
pd
;
pde_t
pde
;
pte_t
*
pt
;
pme_t
*
pdp
;
pme_t
*
pd
;
pme_t
*
pt
;
for
(;;){
pml4
=
&
kpml4
[
PML4X
(
va
)];
pml4e
=
*
pml4
;
if
(
pml4e
==
0
)
{
pdp
=
(
pdpe_t
*
)
pgalloc
();
*
pml4
=
v2p
(
pdp
)
|
PTE_P
|
PTE_W
;
}
else
{
pdp
=
(
pdpe_t
*
)
p2v
(
PTE_ADDR
(
pml4e
));
}
pdp
=
&
pdp
[
PDPX
(
va
)];
pdpe
=
*
pdp
;
if
(
pdpe
==
0
)
{
pd
=
(
pde_t
*
)
pgalloc
();
*
pdp
=
v2p
(
pd
)
|
PTE_P
|
PTE_W
;
}
else
{
pd
=
(
pde_t
*
)
p2v
(
PTE_ADDR
(
pdpe
));
}
pd
=
&
pd
[
PDX
(
va
)];
pde
=
*
pd
;
if
(
pde
==
0
)
{
pt
=
(
pte_t
*
)
pgalloc
();
*
pd
=
v2p
(
pt
)
|
PTE_P
|
PTE_W
;
}
else
{
pt
=
(
pde_t
*
)
p2v
(
PTE_ADDR
(
pde
));
}
pt
=
&
pt
[
PTX
(
va
)];
for
(;;)
{
pdp
=
descend
(
kpml4
,
va
,
0
,
1
,
3
);
pd
=
descend
(
pdp
,
va
,
0
,
1
,
2
);
pt
=
descend
(
pd
,
va
,
0
,
1
,
1
);
pt
=
&
pt
[
PX
(
0
,
va
)];
*
pt
=
pa
|
PTE_W
|
PTE_P
;
if
(
va
==
last
)
break
;
...
...
@@ -101,7 +95,7 @@ setupkvm(void)
if
((
pml4
=
(
pml4e_t
*
)
kalloc
())
==
0
)
return
0
;
k
=
P
ML4X
(
PBASE
);
k
=
P
X
(
3
,
PBASE
);
memset
(
&
pml4
[
0
],
0
,
8
*
k
);
memmove
(
&
pml4
[
k
],
&
kpml4
[
k
],
8
*
(
512
-
k
));
return
pml4
;
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论