Chapter 13 Abstraction: Address Spaces

第 13 章 抽象:地址空间

一些烦人的用户提出要“易于使用”“高性能”“可靠性”等,这导致了所有这些头痛问题,下次见到这些用户的时候,要好好感谢他们...

1. 早期系统

早期的机器没有提供多少抽象给用户...

1.1. 在内存中

  1. 实际上 0 - 64kb 是操作系统的代码

  2. 物理地址从 64kb 开始,并使用剩余的内存

1.2. 几乎没有任何抽象

操作系统开发人员的生活确实很容易,不是吗?

2. 多道程序和时分共享

机器十分昂贵促成了人们共享机器...即在同一台机器执行多个程序,这时候形成了多个进程。

OS管理这一切

2.1. multiprogramming 系统时代

  1. CPU utilization and efficiency are important

  2. interactivity also

  3. 时分共享的方法...

2.2. 进程共享内存

前面说到的 64kb - max kb

会被分配一些给指定的 Process...

操作系统会按照队列来执行这些 processes...

由于有多个程序同时在一个队列中,所以 protection 也显得尤为重要

3. 地址空间

然而我们必须将这些凡人的用户的需求放在心上...

所以要提供一个

3.1. easy to use 的 物理内存抽象

also call address space...是运行的程序看到的系统中的内存。

一个进程的地址空间包含运行的程序的所有内存状态

  1. code 程序代码 指令

  2. stack 栈 保存函数调用信息

  3. heap 堆 管理动态内存分配

假设只有这三个部分,地址空间的分配可以假设如下

0kb - 1kb

code

是静态的,放在顶部,运行时不再需要新的空间

1kb - 2kb

heap↓

会增长会收缩,malloc的时候...

2kb - 15kb

未分配

15kb - 16kb

栈↑

会增长会收缩

3.2. 如何虚拟化内存

virtualizing memory

区分虚拟地址和物理地址

虚拟地址的0kb一般再物理地址的320kb...

通过虚拟地址,可以实现隔离操作...这是内存虚拟化的关键

4. 目标

VM 的一个主要目标是 transparency 透明..意味着这个系统就好像不存在一样,操作系统提供的假象不应该被应用程序看破...

第二个目标是efficiency,尽可能高效的时间和空间上的效率

第三个目标是protection,保护进程不会受到其他进程的影响,避免其他出错或恶意进程

4.1. 虚拟内存物理化

每个程序都以为自己从物理内存的0kb开始操作,其实是在虚拟内存的0kb,而不关系物理内存的位置...

几个目标:

4.2. 你所看到的所有地址都不是真的!

还记得打印出指针的C程序吗!(一些大数字,通常是十六进制)

这也是虚拟地址!

实际上,作为一个用户级别的程序员

你可以看到的任何地址都是虚拟地址......

只有操作系统知道这些指令和数据所在的物理内存的位置

噢对了,还有硬件...

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  printf("location of code: %p\n", (void *)main);
  printf("location of heap: %p\n", (void *)malloc(1));
  int x = 3;
  printf("location of stack: %p\n", (void *)&x);
  return x;
}
root@LAPTOP-GT06V0GS:~/cs/osTEP/chapter13# gcc address.c -o address
root@LAPTOP-GT06V0GS:~/cs/osTEP/chapter13# ./address
location of code: 0x55bf298c3189
location of heap: 0x55bf299846b0
location of stack: 0x7fffe9472ad4

这里看到代码在地址空间的开头,然后是堆,栈在巨大的虚拟空间的另一头...

4.3. The addresses you see in your program output are not0x00

because modern operating systems use a technique called Address Space Layout Randomization (ASLR) to enhance security. ASLR randomizes the memory addresses used by a process, making it more difficult for attackers to predict the location of specific code or data in memory.

random 机制,防止外部猜测地址,进行攻击...

Last updated