1.源代码到执行
源代码test.c从磁盘中,通过gcc编译成a.out(可执行文件)。
执行的时候,是将磁盘中的可执行文件(a.out)映像到内存中。
![](https://i-blog.csdnimg.cn/blog_migrate/e433951e42edbabb7117acde6ad4dd43.png)
2.节视图和段视图
节视图(磁盘中的可执行文件)
不同的功能区域被划分为不同的节。不同的功能区域根据读写权限划分为一个一个段,然后在虚拟内存中发挥作用。
节视图是在磁盘中划分功能的,段试图是程序装载在内存中划分不同的读写执行权限的。
下图中左边是节视图右边是段视图。图片来自ELF文件格式_韩超_InfoQ写作社区
![](https://i-blog.csdnimg.cn/blog_migrate/76a791c40c1ec276213a169078b31dc3.png)
下图来自视频。
![](https://i-blog.csdnimg.cn/blog_migrate/11b657fb1ffa616c80614fc5caba74a5.png)
这里的右边的图片中内存地址的单位是bits
3.ELF文件到虚拟地址空间的映射
节根据读写权限不同被划分为不同的段,然后不同的段由系统完成映射。(对于Linux而言)
![](https://i-blog.csdnimg.cn/blog_migrate/8cc8627a8eee254f47412eaee3e79a64.png)
地址以字节编码1byte=8bits
常以16进制表示。方便阅读,转化迅速(2-16)。
4.虚拟内存
虚拟内存 用户空间每个进程一份。
虚拟内存 内核空间所有进程共享一份。
虚拟内存 mmap段中的动态链接库仅在物理内存装载一份。
CPU和硬件最终访问的都是物理内存,但是由于物理内存的一些机制,所以对于程序员不太友好。所以操作系统为作为中间的桥梁为我们抽象了出了一个虚拟内存这个抽象层。
![](https://i-blog.csdnimg.cn/blog_migrate/e300b8f3b236aef36fb608ad70636ab2.png)
5.虚拟内存结构
![](https://i-blog.csdnimg.cn/blog_migrate/6ceea366dce05be89cbb3f3f2af364b5.png)
整个4GB是这样一个结构,最上边的kernel(内核空间)是共享的。
![](https://i-blog.csdnimg.cn/blog_migrate/418619b28b3fd86eeb2e954732afc4ca.png)
glibc也是只载入一份
![](https://i-blog.csdnimg.cn/blog_migrate/002c643679c3cd7e7b97d39172dc16c4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eaec1692b868be34ba552a49a4fd7279.png)
各个层次
Reserved:保留区域
code,data段是从elf文件拿的
heap:堆空间,满足用户动态内存申请。
mmap:映射一段虚拟内存空间,映射文件或数据
stack:栈,控制程序执行流,协助程序完成程序流转移和恢复的功能。
undefined Region :空闲
Kernel Space:内核空间
6.操作系统:
![](https://i-blog.csdnimg.cn/blog_migrate/4664d3d313e30f367c2dfa62a0d1290d.png)