每个进程运行于自己的内存中,即虚拟地址空间中,在32位操作系统下其大小为4G,
,在32
一、3G的用户空间
1、保留区的大小为128M,是不可访问区。例如定义一个指针p,int*p = NULL;之后不能对p进行使用,因为p的地址为NULL,即0x0000 0000,该地址属于保留区即不可访问区。
2、.text 段存放指令,区域的大小在程序执行前已经确认,可能包含一些只读的常数变量,如字符串常量。
3、.data段存放已初始化数据段的全局变量和静态变量(static修饰的变量)。
4、.bss段存放未初始化以及初始化为0的全局变量和静态变量,在程序加载的时候由内核清0,
5、.heap即堆区,是由用户自己管理,先进先出,动态分配内存malloc、ralloc、calloc是在堆区,通过free()函数释放空间,增长方向是由低地址向高地址增长。
6、共享库:加载共享库和使用mmap共享内存。
5.stack即栈区,是由系统管理,先进后出,保存局部变量、函数形参、自动变量。增长方向是由高地址向低地址增长。
7、命令行参数:C语言中的命令行参数涉及到程序的主函数main(int argc,char *argv[]),argc表示命令行参数的个数,无需用户传递,自动确定,argv[]指向命令行传递进来的参数,其中argv[0]指向的是可执行文件的文件名。
8、环境变量:int execve(char *pathname,char *argv[],char *envp),char *envp即环境变量,它包含一个或许多应用程序所使用到的配置信息,
二、1G的内核空间
Linux操作系统和驱动程序在内核空间,用户不能访问,内核空间在4G虚拟地址的高端,但其映射的物理内存地址在低端。
Linux内核空间有三个区域
DMA区(ZONE_DMA):<16M>直接访问区
普通区 (ZONE_NORMAL):<892M>常用区,映射页目录页表
高端内存区(ZONE_HIGHMEM):<128M>为大于1G的文件作映射