<一>关于进程虚拟地址空间区域内存划分和布局
C++代码在编译完成后会生产.exe程序(windows平台), .EXE以文件的形式存储在磁盘上,当运行.exe程序的时候
操作系统会将磁盘上的.exe文件加载到内存中,那么在加载到内存中的时候,操作系统是如何在内存中存放这个exe程序的?
有没有区域的划分?那么是如何划分的?
首先需要了解一点,程序加载到内存中,是不能直接加载到物理内存中的
现在我们以 X86平台的Linux 环境举例
当我们一个程序(进程)在启动执行时,操作系统会为其分配一个4G(2的32次方)的内存空间(就是进程的虚拟内存地址空间)
如下图内存分配图
点击查看代码
#incclude <iostrea>
using namespace std;
int gdata1=1;
int gdata2=0;
int gdata3;
static int gdata4=10;
static int gdata5=0;
static int gdata6;
int main(){
int a=100;
int b=0;
int c;
static int d=1000;
static int e=0;
static int f;
return 0;
}
如上面代码中的全局变量
gdata1,gdata2,gdata3,gdata4,gdata5,gdata6
无论是普通的还是静态的,他们都叫"数据",每一个数据在编译后,在符号表中都会产生符号.
gdata1和gdata4 初始化了的,而且值部不为0,所以存储在.data段
gdata2和gdata5 初始化了,但是值为0,所以存储在.bss段
gdata3和gdata6 未初始化,存储在.bss段
main 函数中的 a,b,c 不是数据,不会在符号表中产生符号,他们编译只产生指令
例如:move dword prt[a], och ,他们是存储在.text段,当程序运行到这里时,他们是在栈上分配空间的
对于静态的局部变量 如 d,e,f 也是数据,存放在数据段,也会在符号表中产生符号,
程序启动的时候不会初始化,而是在第一次运行到的时候才会初始化, d存储在.data段,e,f存储在.bss段
打印C的值,是一个栈上的随机值,打印f,由于存储在.bss段,系统会负责为.bss段做初始化,置0,所以打印出来f为0
上面红框部分存储在代码段,蓝色框部分存储在数据段
注意:不同的进程之间,用户空间是私有的,内核空间是共享的
最新文章
- Android下创建一个SQLite数据库
- java 22 - 16 多线程之生产者和消费者的问题
- PAT-乙级-1031. 查验身份证(15)
- C#多线程(二)
- POJ 3169 Layout 差分约束系统
- 用vmware安装gho文件
- <;正向/反向>;最大匹配算法(Java)
- python远程批量执行命令
- 内功心法 -- java.util.ArrayList<;E>; (3)
- java网络编程之socket
- Android系统--输入系统(十五)实战_使用GlobalKey一键启动程序
- Vue自定义指令获取DOM元素
- Delphi 项目总结
- 金蝶k3密码批量修改
- Solidworks实例学习
- postgresql主从配置
- C# 导出Excel表格
- 编写脚本-SQL SERVER 用户权限分配
- MySQL锁系列之锁的种类和概念
- hiho_offer收割18_题解报告_差第四题
热门文章
- 关于奇妙的 Fibonacci 的一些说明
- 让 DolphinScheduler 1.3.4 开启 Netty 日志打印,解决流程实例一直在运行中的问题
- React报错之Encountered two children with the same key
- LuoguP3377 左偏树 (左偏树)
- python推导式与海象运算符
- 弹簧高跷题解---双向DP---DD(XYX)​​​​​​​的博客
- 使用RandomAccessFile实现数据的插入效果
- 【C标准库】详解strerror函数
- qt unknown type name编译报错记录
- centos7设置时间和上海时区并进行同步