赞
踩
众所周知,任何的编程语言都会产生两种东西:数据和指令
。那么拿我们c++代码来看,编译链接完成之后在我们Windows上来说会产生一个xxx.exe的可执行文件,现在这个文件放在我们磁盘上,那么cpu肯定是不能直接运行磁盘上的程序的,那么在运行它的时候首先会把这个程序从磁盘上加载到内存当中,那么就涉及到几个问题:
首先我们得搞清楚一点,加载到内存是不可能直接加载到物理内存里!!!
拿我们当前的学习环境为例:在x86 32位Linux环境下
当我们的程序加载到内存的时候首先Linux系统会给当前进程分配一个2^32^
大小的一块空间 也就是4G
。这个空间我们定义为进程的虚拟地址空间那么这个虚拟我们该怎么理解了?IBM是这么解释的:
它存在,你能看的见,它是物理的;
它存在,你看不见,它是透明的;
它不存在,你却看得见,它是虚拟的;
它不存在,你也看不见,他被删除了;
但是一定要记住虚拟内存和虚拟地址空间不能记混了。
.text
段,这个是只读数据段.rodata
一般存放常量字符串;.data
是专门存放初始化且不为0的数据。.bss
段是存放未初始化的以及初始化为0的数据。当我们在全局的作用域里面去写一个全局变量没有初始化时,打印它的值得时候是一个0,这就是因为它存放在.bss段,我们的操作系统会自己负责把.bss段的数据全部置成0,所以这也就是我们为什么看到未初始化的全局变量我们去拓印它的值得时候是0的原因。主函数内的普通变量不会生成符号,而是生成指令,存放在.text段,主函数内的静态局部变量遵循前面的规律。
ZONE_DMA
大概16M的大小。ZONE_NORMAL
大概有800多M,进程空间的PCB块进程控制块都在里面存放,以及内核空间的线程还有内核函数在运行时所依赖的栈空间。ZONE_HIGHMEM
这是映射我们高地址的物理内存的时候做地址映射用的。注意
:每一个进程的用户空间是私有的但是内核空间是共享的。
施磊 腾讯课堂
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。