一、32位系统的内存布局
- 为什么要将进程地址空间划分成内核空间和用户空间?
- 这个和处理器的体系结构有关。比如X86分为
ring0
~ring3
级别,ring0
给内核空间使用,ring3
给用户空间使用;同样的,ARMv7也是如此,svc
给内核使用,user
级别给用户程序使用的。
- 这个和处理器的体系结构有关。比如X86分为
- 所有进程共享内存空间,但各自都独立享用用户空间,给每个进程提供了一个自己占用整个进程地址空间的假象。
- 线性映射区跟物理内存之间的转换非常方便,只需要添加一个偏移量即可。线性映射区也被成为低端内存,除线性映射区外的内核空间为高端内存
vmalloc
保证虚拟地址是连续的,不保证分配的物理页面的地址是连续的。mmap
空间用来映射文件和大段的匿名页面等,当内存分配大段的内存页面时,libc
会偏向使用mmap
来分配进程地址空间
二、进程的角度来看内存布局
.init
段:程序初始化代码段.text
段:程序编译完成后的机器指令.data
段:已经初始化过的全局变量和静态变量.bss
段:保存没有初始化过的全局变量和静态变量
- 该实例描述程序头描述elf文件如何被os映射到进程的虚拟地址空间的。
- 观察发现第一个段中有
.init
段和.text
段, 可读可执行 - 观察发现第二个段中有
.data
段和.bss
段, 可读可写
- 这里是将进程跑起来之后对应的效果。