2017-2018-1 20155211 《信息安全系统设计基础》第13周学习总结

2017-2018-1 20155211 《信息安全系统设计基础》第13周学习总结

  • 我选择学习的是第九章

教材学习内容总结

  • 虚拟内存是核心的,强大的,危险的。

    • 关于危险性,即每次应用程序引用一个变量,间接引用一个指针,或者调用像malloc这样的动态分配程序时,会和虚拟内存发生交互,若使用不当,应用将遇到“段错误”或“保护错误”这样的错误而崩溃。
  • 计算机系统的主存被组成一个有M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址。CPU访问内存的最自然的方式就是使用物理地址,即物理寻址。

  • 早期的PC使用物理寻址,即使到现在数字信号处理器,嵌入式微处理器以及Cray超级计算机这样的系统仍然继续使用这种寻址方式。现代处理器使用的是虚拟寻址。

  • 地址空间是一个非负整数地址的有序集合。一个地址空间的大小是由表示最大地址所需要的位数来描述的。

  • 虚拟空间被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。

  • 未分配的,缓存的,未缓存的在任意时刻被虚拟页面的集合分为三个不相同的子集

  • DRAM缓存的组织结构完全是由巨大的不命中开销驱动

  • 虚拟内存系统必须有某种方法来判定一个虚拟页是否缓存在DRAM中的某个地方,这些功能是由软硬件联合提供的,包括操作系统软件,MMU(内存管理单元)中的地址翻译硬件和一个存放在物理内存中叫做页表的数据结构,页表将虚拟页映射到物理页。

  • DRAM缓存不命中称为缺页。

  • 在虚拟内存的习惯说法中,块被称之为页。在磁盘和内存之间传送页的活动叫做交换或者页面调度。页从磁盘换入DRAM和从DRAM换出磁盘。

  • 按照页面调度和独立的虚拟地址空间的结合,对系统中内存的使用和管理造成了深远的影响。特别地,VM简化了链接和加载、代码和数据共享以及应用程序的内存分配。

  • 形式上来说,地址翻译是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中元素之间的映射,MAP:VAS->VAS U 非空

  • 用来压缩页表的常用方法是使用层次结构的页表。

课后习题

9.11 虚拟地址:0x027c

  • 虚拟地址格式
13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 1 1 1 1 1 0 0
  • 地址翻译
参数
VPN 0x09
TLB索引 0x01
TLB标记 0x02
TLB命中(是/否)
缺页(是/否)
PPN 0x17
  • 物理地址格式
11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 1 1 1 1 1 1 1 0 0
  • 物理地址引用
参数
字节偏移 0x0
缓存索引 0xF
缓存标记 0x17
缓存命中(是/否)
返回的缓存字节 --

9.12,9.13类似

9.14

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int main()
{
    int fd;
    char *start;
    fd = open("hello.txt", O_RDWR, 0); //打开文件
    start = mmap(NULL, 1, PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);  
    if(start == MAP_FAILED) return -1;//判断是否映射成功
    (*start) = 'J';
    munmap(start, 1);
    return 0;
} 

9.15,9.16

9.18

  • 需要考虑四个问题:
    • 初始化的时候,序言块和结尾块是怎么样的。
      序言块八字节8|0x11。
      结尾块四字节0|0x11。
    • 为堆申请更多空间的时候(sbrk),如何更改结尾块
      ,记录最后一个块的alloc。结尾块向后延伸申请的空间,并将刚多出的空间作为一个空闲块。设置为size|(alloc<<1)。再合并该空闲块。需要判断最后一块是否已分配,可通过epilogue来判断。
    • 某个空闲块匹配的时候,如何设置头和下一块的头。
      我们基于以下假设:某个空闲块匹配,上一个和下一个一定不是空闲块(否则可以合并)。
      所以头部就设置为(asize|0x011)。
      如果要分割,则下一块的头部设置为(size-asize|0x010),不用合并,因为再下一块肯定是已经分配。
    • 释放某个块时,如何合并。
      检查头部,alloc_prev = 上一块是否分配
      检查下一个块的头部,alloc_next = 下一个块是否分配。
    • 最后,如果下一块已分配,则需要将下一块头部设置为(原头部&(~0x010))。另外,在mm_malloc中,分配多大的块也要发生相应的变化,因为现在最小块大小可以是DSIZE,而不是2*DSIZE。

和搭档讲解的内容与反馈

  • 主要还是参照老师的ch09测试,对其进行了一遍解析与查找知识点
  • 关于动态内存反馈中malloc,调用malloc要用free,即其是在堆上分配内存
  • 关于linux存储器映射,p586中给出一个例子 bufp=Mmap(NULL,size,PROT_READ,MAP_PRIVATE|MAP_ANON,0,0),映射匿名对象,flags由描述被影射对象类型的位组成。bufp包含新区域的地址
  • 局部性原则保证程序趋向在活动页面集合上工作,从而虚拟存储器工作良好
  • IA32的虚拟地址空间是
  • X86-64 最大可能虚拟地址可为2^64 - 1
  • 虚拟内存提供的重要能力有:把主存看成磁盘上地址空间的缓存;为进程提供一致的地址空间,简化了内存管理;保护进程的地址空间不被其他进程破坏
  • 通过对课后测试的练习,以及对课下测试的共同研讨,感觉对第九章虚拟内存的掌握更加深入。

参考资料

posted on 2017-12-17 18:11  20155211  阅读(200)  评论(1编辑  收藏  举报