C++ : 1.虚拟地址

一.虚拟地址
1.1虚拟地址由来:
计算机发展两个阶段:实模式和保护模式
实模式:程序直接加载到内存。安全保护机制弱,恶意程序可通物理地址的跳转对正常程序恶意篡改
保护模式:程序不是直接加载到内存而是通虚拟地址空间映射到内存。此时为虚拟地址,跳转也是在虚拟地址范围内
C++ : 1.虚拟地址_第1张图片
1.2虚拟定义:
存在,看得见,它是物理的
存在,看不见,它是透明的
不存在,看得见,它是虚拟的
不存在,看不见,它被删除

1.3虚拟地址空间大小:
32位操作系统和64位区别:位指的是最大寻址能力,即计算机一次能处理的最大数据的比特位的个数,即指的是ALU(算术逻辑单元的宽度)32位对应: 2^32=4G,为虚拟地址空间大小(0x0000 0000 - 0xFFFF FFFF)

1.4. 32位虚拟地址4G空间划分:
Linux:1:3,1G内核空间,3G用户空间
Windows:2:2,2G用户空间:2G系统空间
操作系统说的虚拟内存空间一般默指linux的,如图:
C++ : 1.虚拟地址_第2张图片
①从0x00000000到0x08048000的这段空间是预留的,禁止访问
例如:对空指针进行访问,程序会崩溃

②程序运行时产生的指令就放在.text段(代码段又叫指令段)。这一段同时也保存了只读数据 ,例如:char* p = “hello world"中的"hello world”

③.data存放了初始化了的且初始化的值不为0的数据
.bss存放未初始化及初始化为0的数据(未初始化的全局变量会看到值为0,因为存放于.bss段)
举例:
C++ : 1.虚拟地址_第3张图片
C++ : 1.虚拟地址_第4张图片
④堆(heap),当程序运行,new或malloc之后才会分配堆内存,由低地址向高地址增长

⑤加载共享库,也就是动态链接库,Windows下是*.dll ; Linux下是*.so

⑥stack 函数运行或产生线程时,每一个函数/线程独有的栈空间,由高地址向低地址增长的

⑦命令行参数和环境变量,命令行参数如main函数传参,环境变量如搜索头文件、库文件时默认的路径

你可能感兴趣的:(C++ : 1.虚拟地址)