(3)对比裸机运行和基于os虚拟内存运行时,程序的内存结构(内存布局)
1)什么是程序的内存布局?
就是程序存储在内存中运行时,程序所占用的存储空间的结构,也可以被称为“存储映像”。
通过对比发现,其实裸机和基于OS虚拟内存运行时的程序布局几乎差不多,二者的共同之处就是,最基本的组成都是 = 代码段 + 静态数据段 + 堆 + 栈。
但是从图中可以看出,它们还是有区别的。
2)二者的区别
(a)运行地址不同,一个是物理地址,另一个是虚拟地址
(b)相比裸机的情况,基于OS虚拟内存运行时,进程的虚拟内存空间分为了“应用空间”和“内核空间”
· 应用空间:运行应用程序的代码
虚拟内存中的“应用空间”,底层对应的是“应用程序代码”真实所在的物理存储器空间,这种对应关系被称为“映射”。
· 内核空间:运行内核代码
虚拟内存中的“内核空间”,底层对应的是“OS代码”真实所在的物理存储器空间。
不管应用程序有多少个,运行的OS只有一个,所以所有进程虚拟内存中的“内核空间”,映射(对应)的是同一个OS。
程序基于虚拟内存运行时,cpu取指所得到的指令地址都是虚拟地址,
- 如果运行的指令是“应用程序”的指令的话
虚拟地址被转为物理地址,通过物理地址找到“应用程序指令”真实所在的物理空间,取出指令给cpu执行。
- 如果调用了OS的API,就会进入内核空间,cpu取指时所得到的指令地址为“内核空间”的虚拟地址内核空间的虚拟地址被转成物理地址后,找到的是OS所在的真实物理空间,取出的指令自然就是OS的指令。
如此一来,应用层序就能调用OS的系统函数了。
3)基于OS虚拟内存运行时,在栈与堆之间还有一个共享映射区
有关共享操作这个东西,只能在有OS虚拟内存支持的情况下才存在,裸机的话不可能实现的。
· 映射同一个共享库(动态库),多进程共享使用同一个共享库
· 映射相同的物理内存,通过共享内存,实现进程间通信
· 映射相同的文件
共享操作同一个文件。