OSTEP [虚拟] Chapt. 13-15 内存虚拟入门

分类:Operating System, 发布于:2019-04-16 21:01:01, 更新于:2019-04-24 19:37:51。 评论

13.1 - 13.2

这两节就介绍了OS发展史……没啥好说的直接贴三张图 看不懂去重修ICS啊kora

13.3 The Address Space

要想让每个程序都拥有自己的内存,OS需要对物理内存创建一种简单易用(easy to use)的抽象化,叫做地址空间(address space)。理解OS如何实现内存抽象化的关键是理解内存是如何被虚拟化的。

你已经知道这是怎么实现的了,所以本部分内容结束了。

什么,你不知道?重修ICS去啊我*

13.4 Goals

设计虚拟内存(VM)的目标:

  • 透明性:在程序眼里就是霸占了物理内存;
  • 效率:尽可能高效的虚拟化;
  • 内存保护:保护每个进程的内存,实现进程隔离
TIP: The Principle Of Isolation

Isolation is a key principle in building reliable systems. If two entities are properly isolated from one another, this implies that one can fail without affecting the other. Operating systems strive to isolate processes from each other and in this way prevent one from harming the other. By using memory isolation, the OS further ensures that running programs cannot affect the operation of the underlying OS. Some modern OS’s take isolation even further, by walling off pieces of the OS from other pieces of the OS. Such microkernels thus may provide greater reliability than typical monolithic kernel designs.

14.1 Types of Memory

C程序中有两种分配的内存:栈区内存(stack memory),由编译器隐式分配,或者叫自动内存(automatic memory);和堆区内存(heap memory),由用户显式分配。

14.2 - 14.3 介绍了两个🍔🍔都会用的API:malloc()free(),没啥好学的了。

14.4 Common Errors

很多新语言支持自动内存管理(automatic memory management),分配的内存根本不需要手动释放;也可能会有一个垃圾收集者(garbage collector)发现并回收失去引用的内存空间。

书上提供的两个提示:
  1. Segmentation fault is a fancy term for YOU DID SOMETHING WRONG WITH MEMORY YOU FOOLISH PROGRAMMER AND I AM ANGRY.
  2. It compiled or it ran does not equal to it is correct. The problem is usually right where you think it would be, in your code.

常见的弱智错误有:

  • 忘了分配内存 (use strdup() to make life easier);
  • 内存分的不够;
  • 忘了初始化分配的内存;
  • 忘了释放内存(内存泄漏);
  • 提前释放内存(悬空指针);
  • 重复释放内存 (double free);
  • free()了非malloc()分配的内存;
  • ……………………

14.5 Underlying OS Support

malloc()free()一类的函数都没有直接接触到系统调用,他们都是库函数。内存管理的系统调用有:

  • brksbrk:调整堆区底部位置,但永远不要直接调用这两个系统调用。
  • mmap():在程序中创建一块可以像堆区一样使用的匿名内存区域。

14.6 Other Calls

  • calloc():分配并清零内存空间;
  • realloc():分配一块更大的,然后把原来的拷过去。

第15章主题:如何进行地址转换(ICS真的都学过了……)

15.1 Assumptions

为了实现内存虚拟化,先做出以下假设:

  • 用户的地址空间在物理内存中是连续的;
  • 地址空间的大小不是很大,小于物理内存的大小;
  • 每个地址空间的大小都一样。

15.2 An Example

TIP: Interposition Is Powerful

Interposition is a generic and powerful technique that is often used to great effect in computer systems. In virtualizing memory, the hardware will interpose on each memory access, and translate each virtual address issued by the process to a physical address where the desired information is actually stored. However, the general technique of interposition is much more broadly applicable; indeed, almost any well-defined interface can be interposed upon, to add new functionality or improve some other aspect of the system. One of the usual benefits of such an approach is transparency; the interposition often is done without changing the client of the interface, thus requiring no changes to said client.

从程序的角度来说,它的地址空间从0开始,直到16 KB。所有它访问的内存都应该在这个范围内。然而,为了虚拟化内存,OS会把这个进程放在物理内存的某个地方,未必从0开始。问题来了:怎么重定位进程中的内存,而让这个过程对于程序来说是透明的呢?如何让程序产生虚拟地址空间从0开始的幻觉?(给计算机喝昏睡红茶)

而实际上的物理内存就像图15-2这样,第一个槽位给OS占用,其32KB处存放了一个进程的地址空间,其他两个槽位是空的。

15.3 Dynamic (Hardware-based Relocation)

硬件地址转换(翻译)的方法叫做base and bounds(基址?),或者叫做动态重定向(dynamic relocation)。

在这个过程中,需要用到CPU的两个硬件寄存器:一个叫做base register,另一个是bounds (sometimes called limit) register。

程序开始运行时,OS决定它会加载到内存的何处,并设置base寄存器为这个地址。在图15-2中,基址为32 KB处。

从现在起,这个进程产生的内存引用会被处理器翻译(translate)为:物理地址=虚拟地址+基址。程序可以通过虚拟地址访问内存,而硬件则会将地址加上基址的值,获得物理地址。

这个过程叫做地址转换/翻译(address translation);而这个过程发生在运行时,所以又被叫做动态重定向(dynamic relocation)。

base和bounds寄存器是芯片中的硬件结构(每个CPU一个),有时也叫做内存管理单元(memory management unit, MMU)。bound寄存器的使用方式有两种:要么保存内存空间的长度/大小,或者保存内存空间尾部的物理地址

15.4 Hardware Support: A Summary

15.5 Operating System Issues

最后,图15-5以时间为顺序描述了硬件与OS的交互。

评论