首页 /  技术专区  /  C 屏幕太窄?试试伸展一下吧 >

程序的加载、运行(3)

(3)对比裸机运行和基于os虚拟内存运行时,程序的内存结构(内存布局)

1)什么是程序的内存布局?

就是程序存储在内存中运行时,程序所占用的存储空间的结构,也可以被称为“存储映像”。

通过对比发现,其实裸机和基于OS虚拟内存运行时的程序布局几乎差不多,二者的共同之处就是,最基本的组成都是 = 代码段 + 静态数据段 + 堆 + 栈。

image.png

但是从图中可以看出,它们还是有区别的。


2)二者的区别

(a)运行地址不同,一个是物理地址,另一个是虚拟地址

(b)相比裸机的情况,基于OS虚拟内存运行时,进程的虚拟内存空间分为了“应用空间”和“内核空间”

· 应用空间:运行应用程序的代码

虚拟内存中的“应用空间”,底层对应的是“应用程序代码”真实所在的物理存储器空间,这种对应关系被称为“映射”。

image.png

· 内核空间:运行内核代码

        虚拟内存中的“内核空间”,底层对应的是“OS代码”真实所在的物理存储器空间。

        不管应用程序有多少个,运行的OS只有一个,所以所有进程虚拟内存中的“内核空间”,映射(对应)的是同一个OS。


程序基于虚拟内存运行时,cpu取指所得到的指令地址都是虚拟地址,

        - 如果运行的指令是“应用程序”的指令的话

        虚拟地址被转为物理地址,通过物理地址找到“应用程序指令”真实所在的物理空间,取出指令给cpu执行。

        - 如果调用了OS的API,就会进入内核空间,cpu取指时所得到的指令地址为“内核空间”的虚拟地址内核空间的虚拟地址被转成物理地址后,找到的是OS所在的真实物理空间,取出的指令自然就是OS的指令。

        如此一来,应用层序就能调用OS的系统函数了。

3)基于OS虚拟内存运行时,在栈与堆之间还有一个共享映射区

有关共享操作这个东西,只能在有OS虚拟内存支持的情况下才存在,裸机的话不可能实现的。

· 映射同一个共享库(动态库),多进程共享使用同一个共享库

image.png

· 映射相同的物理内存,通过共享内存,实现进程间通信

image.png

· 映射相同的文件

共享操作同一个文件。

image.png



0/200
图片验证码