内核虚拟内存分布

vector :中断向量表

fixmap :内核(虚拟)空间地址固定的映射到物理内存

vmalloc :非连续内存区域    vmalloc()函数用来分配物理上不连续但线性地址空间连续的高端物理内存

lowmem :低端内存

pkmap: 高端内存永久映射区

module:模块

.text(代码段)   可执行文件加载到内存中的只有数据和指令之分,而指令被存放在.text段中,一般是共享的,编译时确定,只读,不允许修改

.init

.data 存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存放在这个区域

.bss 通常用来存放程序中未初始化以及初始化为0的全局/静态变量的一块内存区域,在程序载入时由内核清0


操作系统为了屏蔽I/O底层的差异,创建了VFS(虚拟文件系统),为了屏蔽I/O层与内存之间的差异,产生了虚拟内存。为了屏蔽cpu与内存之间的差异,创建了进程。每个程序运行起来都会拥有一个自己的虚拟地址空间,32位cpu的操作系统,其地址线也为32位,所以虚拟地址空间为2^32 -1= 4G 
一个进程在运行时不可能会用如此大的虚拟地址空间,它们只会用到其中的一部分,而且并不一定连成一片,可能会被分割成几块,每一块连续的虚拟内存块被称为虚拟内存段。 
Linux虚拟内存空间布局如下: 
这里写图片描述 
.reserve(预留)段 
一共占用128M,属于预留空间,进程是禁止访问

.heap(堆) 
用于存放进程运行时动态分配的内存,可动态扩张或缩减,这块内存由程序员自己管理,通过malloc/new可以申请内存,free/delete用来释放内存,heap的地址从低向高扩展,是不连续的空间

.stack(栈) 
记录函数调用过程相关的维护性信息,栈的地址从高地址向低地址扩展,是连续的内存区域


猜你喜欢

转载自blog.csdn.net/pan337520/article/details/79927949