0%

温故知新·虚拟地址

IO

为什么需要虚拟地址空间?

  • 虚拟地址空间和物理地址空间的映射可以解决:
  • 方便编译器和操作系统安排程序的地址分布
  • 程序可以使用一系列相邻的虚拟地址空间来访问物理内存中不相邻的大内存缓冲区。
  • 方便进程间隔离: 不同进程使用的虚拟地址彼此隔离,一个进程中的代码无法更改正在另一个进程中使用的物理内存。
  • 方便OS使用可怜的内存: 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区,当物理内存的供应量变小时,内存管理器会将物理内存页(通常为4KB)保存到磁盘中,数据或代码页会根据需要在物理内存与磁盘之间移动。

ELF

在linux中可执行文件a.out的格式是ELF文件,可以通过file命令进行查看。

1
2
3
file a.out
a.out: ELF 32-bit LSB executable
Copy to clipboardErrorCopied

ELF中主要包含三段:

  • .test,代码段存放二进制机器指令
  • .data,已初始化的全局变量
  • .bss,未初始化的全局变量

另外还包含一些其他的段:

只读数据段

符号段

静态库存放在代码段,绝对地址位置不变。

堆区

存放动态申请的内存地址,向上增长,内存大。

共享库

加载程序运行需要的库,只在程序运行时加载,相对地址位置不固定。

栈区

存放局部变量,向下增长,内存小。