PA3.2

计算机组成原理Ⅱ课程设计》实验报告

目录

思考题

1. ⼀些问题

  1. 因为自身存在低12位的偏移量
  2. 物理地址是必须的,否则使用虚拟地址会陷入死循环
  3. 使用多级页表可以使得页表在内存中离散存储;使用多级页表可以节省页表内存。

2. 空指针真的是’空’的吗?

空指针应该也表示一个虚拟地址,只不过在虚拟地址转换为物理地址后,对应的物理地址会触发空指针解引用的错误。

3. 理解 _map 函数

先取页目录基地址,然后根据虚拟地址和基地址得到页目录项,判断是否需要新的页表,如果需要,就 申请一个新的页表,并且把这个页表的地址和其他的标志位一起存到一个页目录项里面,并且根据虚拟 地址就得到了一个页表项,最后把物理地址和标志位一起放到一个页表项里面写入。

4. 内核映射的作⽤

pd_val.present报错。因为没有进行内核映射拷贝,所以没有页表来存放对应的内核区的虚拟地址,就会出现这种报错。

### 5. git log 和 远程仓库截图

git log

仓库截图

操作题

1.添加分页控制相关寄存器

首先打开HAS_PTE宏(nano-lites/src/main.c

image-20210619203718640

之后找到nemu/include/memory/mm.hCR3,CR0 寄存器进行初始化

image-20210619202035099

然后在restart() 函数中对CR0 进行初始化为0x60000011 ,z在nemu/src/monitor/monitor.c

image-20210619203536765

2.修改访存函数

修改vaddr_read()vaddr_write() 函数(nemu/src/memory/memory.c

image-20210619203329938

3.page_translate()

然后编写 page_translate() 函数

先声明paddr_t page_translate(vaddr_t vaddr,bool w);

之后补全函数

image-20210619204328669

之后修改nanos-lite/src/main.c

image-20210619205224445

最后发现指令还未实现完全还需要实现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 函数如图所示

image-20210622215324610

5.在分页上运行仙剑奇侠传

修改syscall.c 文件中的sys_brk 函数为

image-20210622215535549

之后在PUTTY 中运行仙剑奇侠传即可,结果如图

image-20210623191324151

新的故事:

image-20210623225159795

实验心得

本次实验主要了解了分页的机制问题, 实现了在分页上运行仙剑奇侠传,通过前面多次实验的学些,本次实验可以大体知道出现错误时的错误来源和解决方案,实现基本独立解决问题,同时也对计算机组成原理这门课的理解更进一步。

## 备注

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值