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
- 虚拟内存提供的重要能力有:把主存看成磁盘上地址空间的缓存;为进程提供一致的地址空间,简化了内存管理;保护进程的地址空间不被其他进程破坏
- 通过对课后测试的练习,以及对课下测试的共同研讨,感觉对第九章虚拟内存的掌握更加深入。