lab2实验报告

lab2实验报告

一、实验思考题

Thinking2.1

虚拟地址查询可以不经过TLB和页表的查询,于是不需要进行地址转换。缺点是一个虚拟地址可能对应不同物理地址,导致cache空间的浪费,命中率降低。若cache没有命中,则效率反而会下降。对于每个进程的虚拟空间是独立的,而如果使用cache则需要额外区分是哪一个进程,否则可能影响进程间的独立运行问题。

物理地址查询更有利于数据的安全共享,不会发生上述的缺点。

Thinking2.2

虚拟地址。c语言运行时指针均是虚拟地址。

Thinking2.3

宏函数有

  • 创建链表头
  • 初始化链表头
  • 清除链表
  • 链表的for-each循环
  • 从头部插入链表
  • 从尾部插入链表
  • 从中间某一项的前、后插入链表
  • 删除元素

结构体中有下一项的地址,和上一项中指向下一项指针的地址。因为存放有上一项中指向下一项指针的地址,所以方便了插入和移除结点的操作。通过这样巧妙的设计,有很好的抽象和可扩展性,在使用时可以定义链表结点的类型,而其他的相关操作都已经封装好。

Thinking2.4

使用do-while可以让代码块成为完整的一部分,相当于一句话,避免出现单句if或其他语句中的错误,宏函数展开成为整个部分。

例如

if  (...)
{
  /* something */  
};
else (...)
{
  /* something */
};

利用dev编译时会报错

另外,可以使用break增加控制。

Thinking2.5

真实的物理内存页在物理内存当中,逻辑上我们将其分为页来管理,但真实的物理内存中的内存是连续分布的。

我们可以通过pmap.h中定义的page2pa()函数,传入一个Page结构体指针,即可得到物理内存页的物理地址。

具体实现为物理页框号左移12位。

指针pp相对于pages的偏移量

Thinking2.6

C

Thinking2.7

虚拟地址。在alloc()函数中,有相关代码段。

if (clear) {
        bzero((void *)alloced_mem, n);
}

这里alloced_memfreemem相关,所以为虚拟地址。

Thinking2.8

$0xC0000000+((0xC0000000>>12)<<2) = 0xC0000000+0x00300000 = 0xcC0300000 $

起始地址:\(0xC0300000\)

Thinking2.9

可以有虚拟地址直接得到对应页表项的虚拟地址。设置页目录可以判断页面是否有效,减少内存开销。

Thinking2.10

在实现pgdir_walk()中,有注释段pgdir_walk returns a pointer to the page table entry (with permission PTE_R|PTE_V)

在这个函数中进行了关于PTE_R权限位的相关操作。

Thinking2.11

  • CP0_ENTRYHI的值存放至k1寄存器
  • CP0_ENTRYHI的值修改为a0寄存器的值
  • 利用tlbp查询,如果虚拟地址匹配,则将index保存到Index寄存器中。没有匹配,则Index寄存器的最高位置1
  • 四个nop用于等待tlbp出流水线,保证mfc0读取到更新后的结果
  • CP0_INDEX值写入k0寄存器
  • 如果k0的最高位置1,即值小于0,发生缺失,跳转到NOFOUND处理
  • 清除CP0_ENTRYCP0_ENTRYLO0,更新TLB

Thinking2.12

va2pa的实现中,低12位清零,所以页内偏移并没有被考虑进来,只是获得了va对应物理内存页的首地址,所以改变va的值时,并不改变pa的值。

Thinking2.13

一级页表中多增加一位标记位,由于一级页表的一项映射到4MB的页面地址,需要区分一级页表中存放的是二级页表的入口地址还是4MB大物理页面地址。

二、实验难点图示

主要难点在于理解内存,并且掌握虚拟内存的管理。并且明白什么时候用虚拟内存,何时该用物理内存。并且理解如何利用页表来管理内存。

页目录自映射

UVPT(0x7fc00000) 到 ULIM(0x80000000) 之间的空间只有 4MB

可以通过页表起始地址计算页目录的虚拟地址。

三、体会与感想

本单元主要内容是内存管理,首先是物理内存,在此基础之上需要掌握虚拟内存。直接访问内存有很多不便之处,而通过虚拟内存的方法,可以将不同地址空间独立出来,程序员可以只关注于逻辑地址而不用从头考虑物理内存的规划。

通过学习,完善创建内存管理相关的作业部分,总体来说这次作业是需要花费大量时间来学习的, 需要理解整个的页表机制,以及如何通过每一步的函数来实现复杂功能。以及对于相关指针的运用自己掌握地还不够熟练。

随着实验的进行,操作系统也在不断完善,后续的任务也不会太轻松,需要好好加油。

posted @ 2021-10-19 12:03  Jareth  阅读(111)  评论(0)    收藏  举报