20145325张梓靖 《信息安全系统设计基础》第14周学习总结
20145325张梓靖 《信息安全系统设计基础》第14周学习总结
教材学习
-
虚拟存储器 对主存的抽象机制,是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互。
- 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在内存中只保存活动区域,并根据需要在磁盘和内存之间来回传送数据。
- 为进程提供了一致的地址空间,从而简化了存储器管理。
- 保护了每个进程的地址空间不被其他进程所破坏。
-
物理和虚拟地址
- CPU通过生成一个虚拟地址(Virtual address,VA)来访问主存。将虚拟地址转换为物理地址叫做地址翻译(address translation)。地址翻译也需要CPU硬件和操作系统之间的紧密结合。
- CPU芯片上有叫做存储器管理单元(Memory Management Unit,MMU)的专用硬件。利用存储在主存中的查询表来动态翻译虚拟地址。 查询表由操作系统管理。
-
虚拟存储器作为缓存的工具虚拟存储器(VM)被组织为一个存放在磁盘上的N个连续字节大小的单元组成的数组。每个字节都有一个唯一的虚拟地址,这个唯一的虚拟地址作为到数组的索引。磁盘上数组的内容被缓存到主存中。VM系统通过将虚拟存储器分割为称为虚拟页的大小固定的块来处理磁盘和主存信息交互问题。任何时候,虚拟页的集合都被分为3个不相交的子集。
- VM系统还未分配(或者创建)的页。未分配的块没有任何数据与之相关联。不占用磁盘空间。
- 当前缓存在物理存储器的已分配页。
- 没有缓存在物理页面存储器中的已分配页。
-
虚拟存储器作为存储器管理的工具 操作系统为每个进程提供一个独立的页表,VM简化了链接和加载,代码和数据共享,以及应用程序的存储器分配。
-
Linux虚拟存储器系统 Linux为每个进程维持一个单独的虚拟地址空间:内核虚拟存储器和进程虚拟存储器。内核虚拟存储器包含内核中的代码和数据。
- 内核虚拟存储器的某些区域被映射到所有进程共享的物理页面.如:内核代码,全局数据结构。
- Linux将一组连续的虚拟页面(大小等同于系统DRAM总量)映射到相应的一组物理页面。
- 内核虚拟存储器包含每个进程不相同的数据。页表,内核在进程上下文中时使用的栈等。
-
并发Linux 虚拟存储器区域 Linux将虚拟存储器组织成一些区域(也叫做段)的集合。就是已经存在着的(已分配的) 虚拟存储器的连续片,这些片/页已某种形式相关联。所有存在的虚拟页都保存在某个区域,允许虚拟地址空间有间隙。
-
Linux缺页异常处理 MMU在试图翻译虚拟地址A时,触发缺页。这个异常导致控制转移到缺页处理程序,执行如下步骤:
- 缺页处理程序搜索区域结构链表。把A和每个区域的vm_start和vm_end做比较。如果不合法,触发段错误。
- 试图访问的存储器是否合法,如果不合法,触发保护异常,终止进程。
- 若不存在以上情况,则选择牺牲页,替换,重新执行指令。
-
存储器映射 Linux 通过将一个虚拟存储器区域与一个磁盘上的对象关联,以初始化这个虚拟存储器区域的内容。虚拟存储器区域可以映射到Unix文件系统中的普通文件、匿名文件这两种类型文件。
-
fork函数 当fork函数被当前进程调用时:
- 内核为新进程创建内核数据结构,并分配给它唯一一个PID。
- 为新进程创建虚拟存储器。
- 创建了当前进程的mm_struct,区域结构和页表的原样拷贝。
- 将两个进程的每个页面都标记为“只读”。并给两个区域进程的每个区域结构都标记为“私有的写时拷贝”。
-
execve函数 execve函数加载并运行需要以下几个步骤:
- 删除已存在的用户区域:删除当前进程虚拟地址的用户部分中已存在的区域结构。
- 映射私有区域:为新程序的文本,数据,bss和栈区域创建新的区域结构。所有新的区域结构都是私有的,写时拷贝的。文本和数据区域被映射到执行文件中的文件和数据区。bss区域是请求二进制零,映射到匿名文件。
- 映射共享区域。
- 设置程序计数器。
- execve最后一件事设置PC指向文本区域的入口点。
-
mmap函数 可以使用mmap函数来创建新的虚拟存储器区域,并将对象映射到这些区域中 mmap();munmap函数删除虚拟存储器的区域 munmap()。
代码学习
- condvar 消费者-生产者,编译:
运行结果:
-
count 使用全局变量进程计数,实际上线程各自计自己的数。运行结果:
-
countwithmutex 实现了同一时刻只允许某一线程对于全局变量进行操作。运行结果:
-
createthread 进程(pid)和线程(tid)是不一样的。运行结果:
-
semphore 使用信号量,生产者-消费者。运行结果:
-
share 工作路径、进程与线程的关系、create的返回值、exit与join的返回值、cancel的使用。运行结果:
-
hello_multil fflush用于清空缓冲流,虽然一般感觉不到,但是默认printf是缓冲输出的。fflush(stdout),使stdout清空,就会立刻输出所有在缓冲区的内容。运行结果:
代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 3500行 | 25篇 | 300小时 | |
第一周 | 70/70 | 2/2 | 22/22 | |
第二周 | 150/220 | 1/3 | 23/45 | |
第三周 | 160/380 | 1/4 | 25/70 | |
第五周 | 250/630 | 1/5 | 30/100 | |
第六周 | 25/655 | 1/6 | 27/127 | |
第七周 | 30/685 | 2/8 | 25/152 | |
第八周 | 0/685 | 2/10 | 20/172 | |
第九周 | 61/685 | 2/12 | 22/194 | |
第十周 | 414/1099 | 3/15 | 20/214 | |
第十一周 | 417/1516 | 2/17 | 21/235 | |
第十二周 | 0/1516 | 2/19 | 20/255 | |
第十三周 | 430/1946 | 1/20 | 20/275 | |
第十四周 | 63/2009 | 1/21 | 18/293 |