基础巩固-操作系统-程序的执行

程序的执行

程序的执行可以换成可执行文件执行这种说法

进程可以理解为执行上下文,这就意味着进行计算需要收集各种信息

可执行文件可以理解为在一个进程中描述了新的上下文信息,虽然进程的ID并没有改变

在linux下,打开shell算是打开了一个进程,在shell下执行命令ls -l ,shell进程打开了一个新进程,在新进程中本来是继承了shell进程的全部程序(子进程会将父进程的代码进行拷贝,粘贴到一个新的用户态地址空间内),但是这个新进程是要执行ls命令的,也就是执行某个目录下的ls可执行文件,进程就会调用系统函数execve(),并且传递ls可执行文件的路径,execve() 函数接下来寻找到路径下的可执行文件,判断其文件类型(检查是否是可执行文件),并根据可执行文件中的信息修改原本的执行上下文,当系统调用execve()函数终止时,新进程开始执行代码“”“”,也就是执行ls命令(查看当前目录)。

当一个进程执行可执行文件的时候,他的执行上下文会改变很大,因为从父进程继承的大部分资源会被抛弃

那命令行参数是如何传递给程序的呢?

参数传递依赖于所用的高级语言,在C语言中的

int main(int argc, char * argv[ ] )

argc是参数的个数,argc[ ] 是指向字符串指针数组的指针

比如以下命令:

/usr/bin : ls -l

这条命令是查看/usr/bin下的全部文件目录的命令,由于传递了三个参数,那么argc的值就是3,分别是ls字符串,-l字符串,/usr/bin字符串,argv[]中存放的就是三个字符串的地址

目标文件向可执行文件的转化

编译+汇编源码文件之后,源码文件转变成了汇编语言指令的机器代码,但此时并不能执行,因为一些库文件和其他源码文件不被包含在里面,要进行链接操作

链接操作分为动态链接静态链接,静态链接就是将其他库文件和源码文件中的代码粘合到目标文件形成可执行文件,使用动态链接的文件并不用包含库文件的目标代码,而是指向要用的库文件,程序被装入内存后,动态链接器会专注于分析可执行文件中的库名,确定库在系统目录中的位置并进行内存映射,然后把控制权交给程序,程序执行!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章