(23)关于linux的命令行参数的问题:
从linux的shell提示符运行程序时,linux系统为要执行的程序在内存中创建一个区域,分配给程序的内存区域可以位于系统物理内存的任何位置。为了使这一过程简化,每个程序都被分配给相同的虚拟内存地址。虚拟内存地址从地址0x80480000开始,到地址0xdfffffffff结束。Linux系统按照专门的格式把程序存放在虚拟内存地址中。
内存区域中的第一块区域包含汇编程序的所有指令和数据(来自.bss段和.data段)。指令不仅包含汇编程序的指令代码,而且包含linux运行程序的链接过程所需的指令信息。
内存中的第二块区域是程序堆栈。堆栈从内存区域的底部向下增长。于是,可能大家会认为程序每次启动的时候,堆栈指针都被设置为0xbfffffffff,但是情况并非如此。在加载程序之前,linux把一些内容放到堆栈中,命令汗参数就在这里。看下图表示:
0x00000000环境变量段的结束标志 |
环境变量命令行参数 |
指向环境变量的指针 |
0x00000000此处命令行参数的结束标志 |
……………………………… |
指向命令行参数2的指针 |
指向命令行参数1的指针 |
程序名称 |
参数数目 |
|
|
…… |
…… |
程序代码和数据 0x80480000 |
问题来了,既然是虚拟内存地址,那么堆栈指针esp也被初始化为了虚拟内存的地址。那汇编指令是怎么实际的执行和操作硬件堆栈的呢?
这个答案在操作系统加载执行汇编程序的时候,这个时候操作系统负责解读和转换映射虚拟内存地址到系统物理内存地址。记住操作系统在执行我们写的程序的时候,是一种虚拟的抽象环境,实际内存的管理还是操作系统在负责