Linux内核 内存管理(3)内存布局
首先明白,这是个LINUX的软件概念。毛坯房就是硬件,LINUX内存布局就是装修。
这种分内核和用户空间的,是体系结构的不同运行模式决定的。图片是arm32
线性映射是直接把物理内存映射过来(大小:600M+)
vmalloc是分配非连续物理内存,连续虚拟内存的(大小:200M+)
数据段,代码段,bss(已经定义但没赋初值的全局变量和静态变量)
堆空间:malloc使用
mmap: 映射文件或者映射匿名页面(分配大段虚拟内存)
从进程看内存布局
.init 存放程序初始化的代码段
.text 代码段(源代码编译后的机器指令)
.data (初始化后全局静态变量)
.rodata(只读数据)
.bss(没初始化的静态变量)
示例
addr:虚拟地址
off:相较于起始地址的偏移量
size: 所占大小
示例2 通过cat /proc/<pid>/maps看内存
先介绍一下横轴代表含义:
地址范围(内存区域的起始地址和结束地址)/权限(r读x写x执行p私有映射)/文件在内存中的偏移量/设备号(主次)/文件的inode号,文艺标识文件/映射的文件或者区域
介绍一下竖轴最后一列
/usr/sbin/dhcpcd 程序代码段(因为x)
/usr/sbin/dhcpcd数据段可读
/usr/sbin/dhcpcd数据段可读可写
堆heap
栈stack
/lib/aarch64-linux-gnu/libc-2.32.so libc库,标准共享库
/lib/aarch64-linux-gnu/ld-2.32.so 动态链接器
[vvar] 和 [vdso] 是内核相关的特殊虚拟内存区域,也不属于动态库
执行顺序和依赖关系
libc - 2.32.so
(C 标准库) :是被动态链接器加载的对象之一。大多数 C 语言编写的程序都依赖它,需由动态链接器将其加载到内存后,程序才能调用其中函数 。ld - 2.32.so
(动态链接器) :在系统加载可执行文件时,先于应用程序依赖的其他动态库被加载。它先完成自身初始化(自举过程),之后才去加载像libc.so
这类程序依赖的共享库。