日期:2014-05-16  浏览次数:20766 次

linux 程序加载过程

linux 程序加载过程
2008年11月24日 星期一 08:48 P.M.

一个进程在内存中主要占用了以下几个部分,分别是代码段、数据段、BSS,栈,堆,等参数。其中,代码、数据、BSS的内容是可执行文件中对应的内容,加载程序并不是把它们的内容从可执行程序中填充到内存中,而是将它们的信息(基地址、长度等)更新到进程控制块(task_struct)中,当CPU第 一次实际寻址执行的时候,就会引起缺页中断,操作系统再将实际的内容从可执行文件中复制内容到物理内存中。
????
堆的内容是程序执行中动态分配的,所以加载程序 只是将它的起始地址更新到进程控制块中,执行过程中遇到动态分配内存的操作的时候再在物理内存分配实际的页。参数区在新进程加载的时候要存入环境变量和命令行参数列表。栈在程序加载时候存入的内容就是环境参数列表和命令行参数列表的指针和命令行参数的个数。

1?申请物理页,填充参数

参数的填充要分两种情况,一种是文件是Shell脚本文件,这个时候不但要把shell文件的命令行参数填充进去,还要解析shell文件头信息,将要传入shell程序的参数也要填充到某部分物理内存内,这样参数区中命令行参数列表的长度就加长了:shell程序参数列表。之后,把shell程序作为新的可执行程序,重新启动加载过程。另一种情况就是二进制的可执行文件,这个时候就把环境参数和命令行参数填充到某部分物理内存就行了。这步之后,就会得到参数页的页指针(这些页在物理内存中)一个二进制文件(包括shell程序本身)的内存I节点。

2?清理工作:

??????关闭指定的打开的文件;复位协处理器标志;释放页目录项和页表项,这里需要说明的是和windows很不相同.如果是wind