2017-2018-1 20155233 《信息安全系统设计基础》第十一周学习总结
学习目标
- 理解虚拟存储器的概念和作用
- 理解地址翻译的概念
- 理解存储器映射
- 掌握动态存储器分配的方法
- 理解垃圾收集的概念
了解C语言中与存储器有关的错误
教材学习内容总结
什么是虚拟地址和物理地址:
物理地址:主存被组织成一个由M个连续的字节大小的单元组成的数组。而每一个字节有一个对应的地址,这样的地址就被称作是物理地址。
虚拟内存:针对物理地址的直接映射的许多弊端,计算机的设计中就采取了一个虚拟化设计,就是虚拟内存。CPU通过发出虚拟地址,虚拟地址再通过MMU翻译成物理地址,最后获得数据。
- 虚拟存储器中的块分为:未分配的,缓存的,未缓存的。有效和无效通过一个valid bit(有效位)来进行判断
未分配的:顾名思义,这一块的虚拟存储器不映射于任何块。
缓存的:这一块的虚拟存储器映射于已经存在于DRAM中的物理页。
未缓存的:这一块的虚拟存储器映射于存在于磁盘中的虚拟页。(也就是要使用就要把磁盘中的虚拟页替换到DRAM中的物理页,会发生Page Fault )
- 地址空间的概念
首先,对于32位的计算机,每一个地址所对应的数据空间是32位,也就是四个字节。那么如果一个地址可以用32位表示,那么对于这32位地址的所有可能就是:232种可能,那么32位地址的地址空间就为232。下面所说的,虚拟地址的地址空间和物理地址的地址空间也就是取决于虚拟地址和物理地址的位数,如果位数分别为M,N,那么地址空间也为:2^M^ 和 2^N^.
- 地址分页的概念
对于一整块连续的内存,直接连续使用也是不太符合实际的。于是,就有分页的概念。将1024个地址分成一页,通过访问页来访问数据。那么有了页就要有如何寻找页的概念了。我们通过每一页的首地址作为页入口,即(PTE)来检索页。那么,对于这些PTE,我们也需要一个专门的数据结构来进行管理,这样的数据结构就是页表(page table)。
- 地址翻译目的
地址翻译的目的是通过MMU将虚拟地址翻译成物理地址。
- PTE的三个许可位:
SUP:表示进程是否必须运行在内核模式下才能访问该页
READ:读权限
WRITE:写权限
教材学习中的问题和解决过程
函数使用:
通过调用malloc函数从堆中分配块:
include <stdlib.h>
void *malloc(size_t size);
使用sbrk函数显示地分配和释放堆内存:
#include <unistd.h>
void *sbrk(intptr_t incr);
调用free函数释放已分配的内存:
#include <stdlib.h>
void free(void *ptr);
代码调试中的问题和解决过程
- execve函数在当前进程中加载并运行包含在可执行目标文件a.out中的程序,用a.out程序有效地替代了当前程序。加载并运行a.out需要以下几个步骤:
删除已存在的用户区域。删除当前进程虚拟地址用户部分中的已存在的区域结构。
映射私有区域。为新程序的文本、数据、bss和栈区域创建新的区域结构。所有这些新的区域都是私有的、写时拷贝的。文本和数据区域被映射为a.out文件中的文本和数据区。bss区域是请求二进制零的,映射到匿名文件,其大小包含在a.out中。栈和堆区域也是请求二进制零的。
映射共享区域。如果a.out程序与共享对象(或目标)链接,比如标准C库libc.so,那么这些对象都是动态链接到这个程序的,然后再映射到用户虚拟地址空间中的共享区域内。
设置程序计数器(PC)。execve做的最后一件事情就是设置当前进程上下文中的程序计数器,使之指向文本区域的入口点。
下一次调度这个进程时,它将从这个入口点开始执行。Linux将根据需要换入代码和数据页面。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
上周课堂未实践练习。
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
- [20155210](博客链接)
- 结对照片
- 结对学习内容
- XXXX
- XXXX
- ...
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第一周 | 5/5 | 1/1 | 10/10 | 练习hello.c |
第三周 | 343/350 | 1/3 | 22/56 | 学习信息存储 |
第五周 | 523 /873 | 1/5 | 23/79 | 学习汇编语言 |
第七周 | 671 /1544 | 1/7 | 25/104 | 学习Y86 |
第九周 | 423 /1976 | 3/10 | 22/126 | 学习存储技术 |
第十一周 | 511 /2487 | 2/12 | 23/149 | 学习虚拟存储器 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:XX小时
实际学习时间:XX小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)