首页 园地图库文章列表留言下载
现在位置:首页 -> 网络科技 -> 上网指南
Linux操作系统功能概述续2
作者:佚名 来源:mmkey.com搜集 更新日期:2004-10-1 阅读次数
文字 〖 自动滚屏(右键暂停)

3. 应用程序的装载 文摘园地
假设你在Linux操作系统下编译完成了一个可执行文件a.out,你使用如下明令运行它: 文摘园地
% a.out 文摘园地
如果这次你使用的是非常简单的设备/OS组合,没有虚拟内存,那么下面是发生的事情:
a.
当你敲击上述命令时,shell处在运行状态,可能是tcshbash。另外,shell仅仅是一个程序,它使用printf()函数输出%提示符,并且在一个循环中使用scanf()函数记录你敲击的命令;
b.
然后shell会产生一个系统调用-—-execve(),要求OS运行a.out应用程序。OS在这时开始运行;
c.
OS会查看它的磁盘索引,以决定a.out在磁盘的哪个位置。它会读取a.out的最开始部分,该部分包括该应用程序的大小、该程序使用的数据段列表等等;
d.OS
会查看它的内存分配表(只是OS中的一个数组)以查找一段足够大的未用的内存空间来给a.out使用。(值得注意的是,OS正是这样加载了目前所有的正在运行的程序,所以它知道目前有哪些内存已经被使用,哪些内存是空闲的。)我们需要为a.out的指令(UNIX数语称为程序中的text部分)和数据-—-静态数据项(标量和数组变量,在UNIX中称为data段),以及栈空间和堆空间(被calloc()函数和malloc()函数所使用)留出足够的空间;
e.
接下来OSa.out(包括textdata)装载进上一步所分配出来的内存空间里,然后相应的更改它的内存分配表;
f.OS
会检查a.out文件的某一特定部分,在这里留下了链接器对a.out文件入口点的记录,也就是文件执行的第一条指令;(以我们前面的编译语言为例,这里是__start指令。)
g.
现在OS准备好初始化a.out的执行了。它会将栈指针指向先前为a.out分配好的栈空间。(操作系统会保存它自己的寄存器值,包括之前的栈指针的值。)然后它会将所有命令行参数送到a.out的栈空间里,然后开始执行a.out,比如执行一条JMP指令(或类似功能的)跳转至a.out的入口点;
h.
现在,a.out就开始运行了! 文摘园地
需要注意的是,a.out可能会调用execve()来运行其他程序。比如,gcc就这么做。它先运行cpp C预处理器(它会预编译你的C源文件中的#include#define语句)。然后gcc会运行真正的编译器-—-cc1(正如你所见的,gcc本身只是运行其他组件的管理者),这一过程会产生一个汇编语言文件。然后gcc会运行as-—-汇编语言编译器-—-来生成a.o机器代码文件。后者必须被某些代码,比如/usr/lib/crt1.o,和一些其他的构成main()结构的文件,比如argv明令行参数的入口,所所链接,也要链接到C库,/lib/libc.so.6;所以,gcc会运行链接器-—-ld。以上所有例子中,gcc都是通过调用execve()系统调用来运行这些程序的。 文摘园地
3.1
巩固上述概念:自己尝试这个命令 文摘园地
UNIX
系统命令strace会报告你执行的应用程序的系统调用。使用方法如下: 文摘园地
% strace a.out
你将会看到在一系列不同的系统调用之前有execve()的身影,正是由它来启动a.out程序的。


上篇文章: Linux操作系统功能概述续3
下篇文章:七夕礼物
相关文章:
没相关文章

版权所有:文摘园地;本站资料均由站长收集,如果有侵权,请立即来信留言告诉我们,以免损害您的权益,谢谢!
Copyright © 2004 文摘园地 http://wwww.mmkey.com All Rights Reserved Power by:HeadWind
粤ICP备05098767号