No.1
进程的地址空间
现代的操作系统为应用程序提供了一个虚拟的内存空间。在32位的系统里,这个内存空间拥有4GB的寻址能力,Linux默认情况下将高地址的1GB空间分配给内核,用户使用剩下的3GB的内存空间称为“用户空间”,一般来讲,应用程序使用的内存空间有如下的“默认权限”:
栈:栈用于维护函数系统调用的上下文,离开了栈,函数调用就没法实现。
堆:堆是用来容纳应用程序动态分配的内存区域,当程序使用malloc或new分配内存时,得到的内存来自堆里。
可执行文件映像:这里存储着可执行文件在内存里的映像,由装载器在装载时将可执行文件的内存读取或映射在这里。
保留区:保留区并不是一个单一的内存区域,而是对内存中受到保护而禁止访问的内存区域的总称。例如:大多数操作系统里,极小的地址通常都是不允许访问的:如NULL。通常C语言将无效的指针赋值为0也是出于这个考虑。
No.2
栈
栈在程序运行中具有举足轻重的位置,栈保存了一个函数调用所需要的维护信息,这常常被称为堆栈帧或活动记录。堆栈帧一般包括如下几方面内容: