购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 程序的装载与调度执行

2.3.1 可执行文件的装载

在shell提示符下运行可执行文件时,实际上相当于调用了execve()函数。此时操作系统会调用程序装载器。程序装载器会首先读取可执行文件并生成一个进程,并初始化对应的命令、数据和进程栈页表以及寄存器,然后执行一条跳转命令跳转到程序的第一条命令或程序入口点(_start符号的地址)开始执行Prog程序。

在32位Linux系统下,可执行文件装载进内存运行的镜像如图2.15所示。

图2.15 在32位Linux系统下可执行文件装载进内存运行的镜像

说明:

(1)可执行文件被装载的代码段起始地址。在默认情况下,32位Linux系统下可执行文件被装载的代码段起始地址为0x8048000,64位的Linux系统的起始地址为0x400000。可以使用如下命令查看:

如果要改变可执行文件被装载的代码段起始地址,如设置为0x80000,可以在链接阶段增加如下选项进行修改:

.bss和.data的选项依次为-Tbss org和-Tdata org。其中org是一个以十六进制数字表示的地址。

(2).data和.bss为静态数据区,当可执行文件被调度运行时,该文件会被复制到内存区域。堆和栈为动态数据区,其中,栈会根据函数的调用与返回动态变化,堆会根据用户的malloc()、free()函数动态变化。

(3).data以及其他段的地址。.data的起始地址是从代码段后的下一个4 KB对齐的地址。在运行可执行文件时,堆从接下来的下一个4 KB对齐的地址开始。堆之后有一个专门为共享库预留的段。在运行可执行文件时,用户栈从高地址往低地址增长。栈上的预留段供操作系统内核使用。 G+Hu7a/0QF4/5n2EWxQ+SU03xItEBhfu/JkRx+4xAUhXDsfsmfadBvf1dNHdK5H2

点击中间区域
呼出菜单
上一章
目录
下一章
×