可执行文件
- 一个可执行文件存储在硬盘的一个分区中。
- Linux中可以直接运行的文件是二进制可执行文件和Shell脚本文件,那么新程序的加载和运行就是对这两种文件进行加载和运行。
加载
- 一个进程在内存中主要占用的几个部分,分别是代码段、数据段、BSS,栈,堆,参数。
- 代码段、数据段、BSS的内容是可执行文件中对应的内容,加载程序并不是把它们的内容从可执行程序中填充到内存中,而是将它们的信息(基地址、长度等)更新到进程控制块PCB中,当CPU第一次实际寻址执行的时候,就会引起缺页中断,操作系统再将实际的内容从可执行文件中复制内容到内存(此时缺页的进程阻塞)
- 堆的内容是程序执行中动态分配的,所以加载程序只是将它的起始地址更新到进程控制块中,执行过程中遇到动态分配内存的操作的时候再从物理内存分配实际的页。
- 参数区在新进程加载的时候要存入环境变量和命令行参数列表。
- 栈在程序加载时候存入的内容就是环境参数列表和命令行参数列表的指针和命令行参数的个数。
加载后
- 程序被加载到内存中时称为进程
- 每一个进程自认为占用了内存的几乎所有空间,进程的总地址4GB,这个叫做虚拟空间地址