进程栈的初始化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012351051/article/details/81210637

   之所以写这个主题,是因为之前对于进程或程序的栈初始化及内容的概念是模糊的,而这个概念又具有一定的代表性,比如linux引导,普通进程运行启动等等。

   一般进程刚开始启动的时候,是需要知道一些进程运行环境的,最基本的就是系统环境变量和进程的运行参数,这里最常见的一种做法是操作系统在进程启动前会将这些信息提前保存到进程的虚拟空间的栈中,我们假设系统中有两个环境变量:

HOME=/home/usr
PATH=/usr/bin

    假设我们运行该程序的命令行为:

$ prog 123

  假设堆栈底部的地址为0xBF802000,那么进程初始化后的堆栈就如下图所示:

 

   上图中可知,堆栈顶寄存器sp指向的位置是初始化以后的堆栈顶部,最前面的4个字节表示 命令行参数的数量,我们的例子里是用2个命令参数,即"prog"和“123”,紧接着就是分布指向的这两个参数字符串的指针(地址),对比就发现那个指针地址对应的内从就是“prog”和“123”,后面跟了一个0.紧跟着就是指向环境变量字符串的指针,对比发现,就是前面说的那两个环境变量,到这里就特别有意思,也突然有一种豁然开朗的感觉,靠!原来所谓的环境变量。。启动参数各种东东,在堆栈中是用这么简单直接又二到无穷大的方式进行存储的啊,每个地址对应的是1个字节,所以从0xBF801FE0到0xBF801FF0共有0x10即16个字节,存放的就是其中一个“环境变量字符串各个元素(字母)”,同样的道理从0xBF801FF0到0xBF801FFC存放剩下的环境变量。

    进程在启动后,程序的库部分会把堆栈里的初始化信息中的参数信息传递给main函数,也就是我们既熟悉又陌生的那两个argc和argv两个参数,这两个参数分别对应这里的命令行参数数量和命令行参数字符串指针数组。所以argc和argv不是摆设,是偷偷的被使用了。

猜你喜欢

转载自blog.csdn.net/u012351051/article/details/81210637