1.虚拟地址概念的引出
我们在学习C++/C 的时候,学到的内存分布图是这个样子的
我们接下来在Linux下用代码来验证一下
查看一下一段代码和程序,看看可以发现什么有趣的结论
奇怪了,同一块空间的数据竟然有两个不一样的值
地址空间怎么可能没有发生变化?
如果C/C++打印出来的是物理空间的地址,这种现象还存在吗?
绝对不可能,所以说,我们在这里使用的是虚拟地址而不是物理地址
2.进一步理解虚拟地址(为什么要有地址空间)
每个进程都有地址空间,也就意味着操作系统要管理地址空间,除了管理PCB,也要管理地址空间 ->地址空间,本质上是OS里的一种数据类型
记忆:大富翁给每个私生子画饼
为什么要这么干(通过页表建立映射)
为什么不直接从虚拟地址直接链接到物理地址呢?
直接访问物理内存,OS不会做任何干涉,可能会存在危险(恶意更改其他进程的代码和数据等等),严重威胁系统的安全性
例子:
const int char *str = "hello world";
*str = 'H';
为什么这两行代码是不可以的呢,从语言的角度,我们只知道他们放在字符常量区。
那为什么放在常量区就不可以访问了呢?
本质是os给你的只有r(只读)的权限
为什么要有地址空间的第一个理由
通过添加一层软件层,完成有效的对进程操作内存进行风险管理(权限管理),本质目的是为了保护物理内存以及各个进程的数据!
—————————————————————————————————
在这里插入图片描述
我们申请了1000个字节,我们就可以立即使用吗?
不一定,可能会存在暂时不会全部使用甚至暂时不使用
在OS角度,如果空间马上给你,整个系统中会有一部分空间本来可以给别人立马使用现在却被你闲置着 ->有了空间,但是从来没有过读写
OS的操作系统动作是透明的
也就是写实拷贝
为什么要有地址空间的第二个理由
将内存申请和内存使用的概念在时间上划分清楚,通过虚拟地址空间,来屏蔽申请内存的过程,达到进程读写内存和OS进行内存管理操作, 进行软件上面的分离
—————————————————————————————————
为什么要有地址空间的第三个理由
站在CPU和应用层的角度,进程统一可以看做统一使用4GB空间,而且每个空间区域的相对位置,是比较确定的
OS最终这样设计的目的,达到一个目标:每个进程都认为自己是独占资源的!
—————————————————————————————————
3.进一步看进程和程序有什么区别?
进程是要有 描述进程的PCB + 进程地址空间 + 页表 + 代码和数据 ,这样才叫进程
4. 共享
实际上这里的常量是只读的(r),OS对系统常量只维护一份,是成本最低的
5.分享一下OS下最终的地址空间分布图
通过下列代码我们可以发现,栈的上面还有命令行参数和环境变量