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 这类程序依赖的共享库。

#嵌入式##嵌入式笔面经分享##牛客创作赏金赛#
全部评论

相关推荐

06-04 18:37
门头沟学院 Java
勇敢的ssr求对象:前面看的有点奔溃,看到只有你是真玩啊,忍不住笑出了声😂
点赞 评论 收藏
分享
投递阿里巴巴控股集团等公司7个岗位 今年秋招哪家公司给的薪资最良心?
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务