【linux进程(七)】程序地址空间深度剖析-LMLPHP

1. 前言

由于此Linux系列文章偏向于做
顺序学习手册,所以有些内容在
一篇文章中可能不连贯,敬请谅解!

请先阅读下面的文章的最后一段
了解打印出来的地址并不是物理地址
这一事实逻辑:

程序地址空间前言

  • 什么是地址空间?
  • 地址空间是如何设计的?
  • 为什么要有地址空间?

2. 什么是程序地址空间?

在理解地址空间前,我们知道一个事实:
平时看见的地址并不是真实的地址
又叫虚拟地址,真实的地址空间
被称为物理地址(物理内存)

【linux进程(七)】程序地址空间深度剖析-LMLPHP

  1. 富豪对应操作系统
  2. 10亿美金对应物理地址
  3. 私生子对应每一个进程
  4. 富豪画的饼对应地址空间

所以可以得出结论,地址空间可以
理解为操作系统给进程画的饼
它并不是真实的物理地址!


3. 程序地址空间是如何设计的?

既然富豪给每一个私生子都画了饼
所以对应每一个进程都又一个自己的
程序地址空间,这是第一个结论

然而,OS要管理这些空间,一定
要先组织,再管理!所以地址空间
是一个struct结构,**这是第二个结论**

【linux进程(七)】程序地址空间深度剖析-LMLPHP

程序地址空间无非就是各个
区域的结合,然而各个区域的划分
无非就是两个整数begin和end
一个在区域的开头,一个在区域的结尾
这是第三个结论!

【linux进程(七)】程序地址空间深度剖析-LMLPHP

struct addr_room
{
	int code_start;//代码区起始
	int code_end;//代码区结束
	int init_start;//初始化区起始
	int init_end;//初始化区结束
	int heap_start;//堆区起始
	int heap_end;//堆区结束
	......
	其他属性
};

所谓的区域范围变化
实际上就是对start和end做加减!


4. 虚拟地址和物理地址的关联

当我们理解了什么是虚拟地址后,
现在再谈虚拟地址和物理地址的关系:

本质是一种映射关系!

【linux进程(七)】程序地址空间深度剖析-LMLPHP


【linux进程(七)】程序地址空间深度剖析-LMLPHP


5. 页表的结构以及作用

修改常量字符串时编译器会报错,
是在哪个阶段报的错呢?

const char* p = "abcd";
*p = "123";

其实页表不仅仅只有映射关系
表这一个结构,

【linux进程(七)】程序地址空间深度剖析-LMLPHP

所以页表可以起到安全评估
保护物理内存的作用!
这是页表的第一个作用


将无序变有序


6. 为什么要存在地址空间?

通过以下三个方面来说明
地址空间的作用:

  1. 有效的保护了物理内存
  1. 使OS的耦合度更低
  1. 保证进程的独立性

7. 总结以及拓展

关于Linux进程基础的内容就讲到
这里,下一章是全新的章节–进程控制
讲了这么久的理论了,怎么控制一个进程?
也就是创建,回收一个进程?有了前面
的基础铺垫后,后面的学习内容也就容易了

Linux中页表的内核代码


10-30 10:13