教材学习内容总结
- 为什么程序员需要理解虚拟内存?
- 虚拟内存是核心的
- 虚拟内存是强大的
- 虚拟内存是危险的
- 虚拟内存如何工作
- 地址空间是一个非负整数地址的有序集合
-
地址空间中的整数是连续的,线性地址空间
-
虚拟地址空间
-
物理地址空间
-
2. 虚拟内存作为缓存的工具
1. 虚拟内存被分为三个不相交的子集:未分配的、缓存的、未缓存的。
2. 页表
3. 页命中
4. 缺页
5. 局部性原理帮助虚拟内存提高访问效率
3. 虚拟内存作为内存管理的工具
1. 简化链接
2. 简化加载
3. 简化共享
4. 简化内存分配
-
虚拟内存作为内存保护工具
- 带有许可位的段表
- 触发保护——“段错误”
-
地址翻译
- 如何使用和管理虚拟内存
-
linux的内存区域
一个区域是已经存在 或者说是已经分配的虚拟内存的的连续片 -
linux缺页异常处理
-
内存映射
- linux文件系统中的普通文件
- 匿名文件
- 共享对象&私有对象||共享区域&私有区域
- 加载并运行a.out需要几个步骤
- 删除已存在用户区域
- 映射私有区域
- 映射共享区域
- 设置程序计数器
- 使用mmap函数的用户级内存映射(新建一个新的虚拟内存区域)
-
动态内存分配
此部分可以根据操作系统课上所学进行理解
教材学习中的问题和解决过程
- 问题一:fgets()函数如何限制输入串的长度
- 问题一解决方案:将file变量部分改为stdin默认是从键盘输入,fgets()的参数会限制每次读入字符串的长度,不管长或短都不会至于使缓存溢出
- 问题二:free后通过输出发现指针的值没有发生变化
- 问题二解决方案:free后只是将指针所指内存内容交还给内存重新分配,其中的值不必发生变化
代码调试中的问题和解决过程
- 问题一:操作空闲链表的几个函数不理解
- 问题一解决方案:
通过使用,大致理解是:
- get_size:通过p的地址的整型表示与0x7的反进行与操作获得p所占的内存大小
- get_allocc:通过p的地址的整型表示与0x1的进行与操作获得p所占的内存大小
不明白的是这两个函数用处之间有什么区别。
代码托管
本周结对学习情况
-
结对学习内容
一起做实验,指正笔记中的问题,相互回答课堂上的疑问
2017-2018-1 20155203 20155204 实验四 外设驱动程序设计
其他(感悟、思考等,可选)
本周的学习中收获比较大主要是因为和刚刚学过的操作系统知识紧密的结合在了一起,学习效率提高很多。同时在后面的敲代码的陋习引起的内存问题有了更多的理解。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 1/1 | 6/6 | |
第三周 | 156/388 | 2/3 | 15/21 | 这周除课堂实践外,大多数都是知识性的学习内容,代码量确实太少从下周起就要抓紧了 |
第四周 | 156/388 | 3/6 | 15/36 | 每天100行好难啊,不过感觉找到了学习的一些动力。在调试代码上花的时间太多,都要没时间看书了,还要继续改进 |
第五周 | 284/ 745 | 1/7 | 15/51 | |
第七周 | 1812/ 2557 | 2/9 | 10/61 | |
第八周 | 564/ 3121 | 2/11 | 10/71 | |
第十一周 | 295/3416 | 2/16 | 10/81 |
-
计划学习时间:10小时
-
实际学习时间:10小时