zoukankan      html  css  js  c++  java
  • 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的虚拟地址空间是{0,1,...,2^32 - 1}
    • X86-64 最大可能虚拟地址可为2^64 - 1
    • 虚拟内存提供的重要能力有:把主存看成磁盘上地址空间的缓存;为进程提供一致的地址空间,简化了内存管理;保护进程的地址空间不被其他进程破坏
    • 通过对课后测试的练习,以及对课下测试的共同研讨,感觉对第九章虚拟内存的掌握更加深入。

    参考资料

  • 相关阅读:
    django email用法
    django ImageField用法
    django集成微博内容
    python读写zip文件
    读写文件
    404渲染
    bzoj1297 / P4159 [SCOI2009]迷路
    bzoj1009 / P3193 [HNOI2008]GT考试
    poj2115 C Looooops(exgcd)
    bzoj1407 / P2421 [NOI2002]荒岛野人(exgcd)
  • 原文地址:https://www.cnblogs.com/xxy9712/p/8052774.html
Copyright © 2011-2022 走看看