赞
踩
目录
任何的编程语言都会产生两种东西:指令和数据。
C++代码编译连接后会产生一个.exe可执行文件,放在磁盘上。CPU不可能直接运行磁盘上的程序。CPU首先把程序从磁盘上加载到内存中,那么它把可执行程序的哪些东西加载到内存当中,加载到内存当中如何存放?内存有没有区域的划分,划分了以后是什么样子?
以x86 32位linux环境为例,当一个程序运行时,linux系统内核会给进程开辟一个2的32位,也就是4G大小的虚拟地址空间,默认被划分为两个部分:
用户空间3G,内核空间1G(可以通过修改系统的配置,来调整内存比例)
指令运行时放在代码段/.text段
char *p = “hello world”
指针p在栈上,“hello world”字符串在.rodata只读数据段
.text 和 .rodata只能读,不能写。
放的是数据,已经初始化的,而且初始化不为0的数据;
已经初始化的全局变量,静态变量,常量。
我们在全局的作用域上去写全局变量,没有初始化,我们去打印它的值,是0,因为存放在.bss段,程序运行时,内核给当前进程分配内存空间,将未初始化的数据放在.bss段,内核将.bss段数据全部置为0;
windows下是:.dll linux下是:.so
存储命令行参数和环境变量用于传递和存储进程运行时的配置信息和环境参数。
内核空间主要分为了3个区域:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。