计算机组成原理Ⅱ课程设计》实验报告
目录
文章目录
思考题
1. ⼀些问题
- 因为自身存在低
12
位的偏移量 - 物理地址是必须的,否则使用虚拟地址会陷入死循环
- 使用多级页表可以使得页表在内存中离散存储;使用多级页表可以节省页表内存。
2. 空指针真的是’空’的吗?
空指针应该也表示一个虚拟地址,只不过在虚拟地址转换为物理地址后,对应的物理地址会触发空指针解引用的错误。
3. 理解 _map 函数
先取页目录基地址,然后根据虚拟地址和基地址得到页目录项,判断是否需要新的页表,如果需要,就 申请一个新的页表,并且把这个页表的地址和其他的标志位一起存到一个页目录项里面,并且根据虚拟 地址就得到了一个页表项,最后把物理地址和标志位一起放到一个页表项里面写入。
4. 内核映射的作⽤
pd_val.present
报错。因为没有进行内核映射拷贝,所以没有页表来存放对应的内核区的虚拟地址,就会出现这种报错。
### 5. git log 和 远程仓库截图
git log
仓库截图
操作题
1.添加分页控制相关寄存器
首先打开HAS_PTE
宏(nano-lites/src/main.c
)
之后找到nemu/include/memory/mm.h
对CR3,CR0
寄存器进行初始化
然后在restart()
函数中对CR0
进行初始化为0x60000011
,z在nemu/src/monitor/monitor.c
中
2.修改访存函数
修改vaddr_read()
和 vaddr_write()
函数(nemu/src/memory/memory.c
)
3.page_translate()
然后编写 page_translate()
函数
先声明paddr_t page_translate(vaddr_t vaddr,bool w);
之后补全函数
之后修改nanos-lite/src/main.c
最后发现指令还未实现完全还需要实现mov_r2cr() mov_cr2r()
填表:
/* 0x20 */ IDEX(mov_G2E,mov_cr2r), EMPTY, IDEX(mov_E2G,mov_r2cr), EMPTY,
实现make_EHelper(mov_r2cr)
make_EHelper(mov_r2cr) {//给cr寄存器赋值
switch (id_dest->reg)
{
case 0:
cpu.cr0.val = id_src->val;
break;
case 3:
cpu.cr3.val = id_src->val;
break;
default:
assert(0);
break;
}
print_asm("movl %%%s,%%cr%d", reg_name(id_src->reg, 4), id_dest->reg);
}
实现make_EHelper(mov_cr2r)
make_EHelper(mov_cr2r) {//给寄存器赋值
switch (id_dest->reg)
{
case 0:
id_src->val = cpu.cr0.val;
break;
case 3:
id_src->val = cpu.cr3.val;
break;
default:
assert(0);
break;
}
print_asm("movl %%cr%d,%%%s", id_src->reg, reg_name(id_dest->reg, 4));
#ifdef DIFF_TEST
diff_test_skip_qemu();
#endif
}
4.修改 loader()
首先修改navy-apps/Makefile.compile
中的链接地址为 0x8048000 并重新编译,nanoslite/src/loader.c
中的 DEFAULT_ENTRY 也要作相应的修改。
之后修改loader
函数如图所示
5.在分页上运行仙剑奇侠传
修改syscall.c
文件中的sys_brk
函数为
之后在PUTTY
中运行仙剑奇侠传即可,结果如图
新的故事:
实验心得
本次实验主要了解了分页的机制问题, 实现了在分页上运行仙剑奇侠传,通过前面多次实验的学些,本次实验可以大体知道出现错误时的错误来源和解决方案,实现基本独立解决问题,同时也对计算机组成原理这门课的理解更进一步。
## 备注
无