为什么Linux内存中存在重复数据?Android Unity游戏进程内存映射疑问
关于Android系统中
/proc/[pid]/maps出现同so多段映射的解答 这是Linux内核内存管理的刻意设计,Android基于Linux内核,自然沿用了该机制,不属于异常问题。
- 你观察到的两个相邻虚拟地址段
0c300000-0c301000和0c301000-0c302000,虽然都来自/system/lib/arm/nb/libdl.so,但二者的内存访问权限完全不同,对应ELF格式动态库中不同属性的节:- 地址更低的段通常是只读可执行的代码段(权限为
r-x),存放动态库的可执行机器指令 - 相邻的高地址段通常是可读可写不可执行的数据段(权限为
rw-),存放动态库的全局变量、静态变量等需要运行时修改的数据
- 地址更低的段通常是只读可执行的代码段(权限为
- 这种拆分映射是为了满足W^X(写权限与执行权限互斥)的内存安全要求,避免恶意代码篡改可执行指令,同时也符合Linux内存映射的页对齐规则(单段最小映射单位为4KB,对应你看到的
0x1000长度)。 - 你路径中的
nb是Native Bridge的缩写,这是Android的跨架构兼容层,用于在非ARM架构设备上运行ARM架构的二进制程序,该兼容层会对部分系统库的映射做特殊调整,即使出现相同文件偏移的多段映射也是兼容层的刻意设计。
注:同一份动态库映射出多个不同权限的虚拟内存段是所有类Unix系统的通用做法,并非重复加载数据,二者在物理内存中对应的是完全不同的内容,不存在空间浪费问题。
内容的提问来源于stack exchange,提问作者user16387400
相关产品推荐
相关产品推荐

