Linux进程地址空间

进程地址空间

  • 一.一个引例
  • 二.进程地址空间
    • 1.宏观了解
    • 2.谈细节
      • 1.什么是地址空间?如何理解地址空间上的区域划分?
    • 2.为什么要有进程地址空间呢?(虚拟地址)
    • 3.页表
  • 三.总结

一.一个引例

Linux进程地址空间_第1张图片

Linux进程地址空间_第2张图片
我们可以发现子进程的g_val改变了,但父进程的g_val并没有改变。
这里根据之前所学可以解释:进程具有独立性,当子进程更改变量时,发生写时拷贝,所以g_val变成了两份互不影响。 但是可以发现一个现象,尽管值不同,但他们的地址是相同的。那么可能同一变量,同一地址,同时读取,读到了不同的值呢?

对此可以简单得出一个结论;如果地址是物理地址,那么是不可能出现上面现象的!所以该地址不是物理地址!(线性地址或者虚拟地址)

包括平常所写的语言的地址全部都不是物理地址。

二.进程地址空间

1.宏观了解

实际上每一个程序在创立时,操作系统都会生成一个进程地址空间。

Linux进程地址空间_第3张图片

在子进程刚创建时是按照父进程的模板,与父进程共享代码和数据,所以此时两者的虚拟地址和物理地址都是同一值。

Linux进程地址空间_第4张图片

而当我们改变了g_val的值后,操作系统发现子进程是与父进程共享空间的,操作系统就会额外开辟一块空间。同时修改子进程的虚拟地址,物理地址的映射关系,使其指向新的空间。这就是**写时拷贝-由操作系统自动完成。**其本质是重新开空间,但虚拟地址是不受影响的。

Linux进程地址空间_第5张图片

2.谈细节

1.什么是地址空间?如何理解地址空间上的区域划分?

当我们谈论一个进程在访问空间时,该进程一定处于运行状态。在32位计算机里,一共有32根地址总线,每一根总线有0/1两种可能,那么总共有2^32种组合—4GB。而地址总线排列组合形成的地址范围就叫做地址空间

假设有两个对象叫小胖和小花,整个地址空间是从【1,100】,而小胖的地址划分在【1,50】,小花的地址划分在【51,100】.那么小胖和小花如何知道自己的地址划分在哪呢?很简单,只需要定义一个结构体分别记录小胖和小花的地址范围即可。区域划分本质上就是定义起始位置和终止位置。而对地址区域的调整本质就是调整start,end。

Linux进程地址空间_第6张图片

2.为什么要有进程地址空间呢?(虚拟地址)

如果没有进程地址空间,那么每个进程就会直接访问物理地址,如果该进程的访问越界修改就会将其他进程数据修改。而虚拟地址通过页表相当于有一个中转器,将其映射到物理内存,在这个转化过程中,可以对访问内存进行审查,所以一旦异常访问,直接拦截,从而起到保护物理内存的作用。

3.页表

1.页表相当于虚拟地址和物理地址的映射表,前面说过只有在进程运行时才会进程内存的访问。,每个运行的进程的页表地址都会存在CPU里的一个名为cr3寄存器里。而当该进程被切换时,该进程会将该页表地址带走存在task_struct里,而当再次运行时又将页表地址放在cr3寄存器里。

2.页表内有对应的权限标志位用来表证它所对应的物理内存是可读还是可写。这也是为什么代码区和字符常量区是只读的,因为页表已经进行了权限管理

3.页表内也有一个标志位用来判断数据释放在内存里。

三.总结

1.页表让进程以统一的视角看待内存—即虚拟内存映射物理内存,可以让物理内存任意分布,对应的进程都能找到对应的内存位置。

2.进程地址空间可以有效的保护物理内存

2.因为有进程地址空间和页表的存在,实现了进程管理模块和内存管理模块实现了解耦合

你可能感兴趣的:(Linux系统,linux,服务器,运维)