程序装载与运行中的那些事
2023-12-02 17:39:14
作为计算机系列文章的第六篇,我们来聊聊程序是如何装载和运行的。当我们使用电脑时,无论是打开文档、浏览网页还是运行程序,操作系统都会负责将这些文件装入内存并执行。
程序装载过程
在Linux系统中,当用户在bash中输入命令执行某个ELF可执行文件时,系统会经历以下步骤:
-
创建新进程
首先,在用户层面,bash进程会调用fork()系统调用创建一个新的进程。
-
执行ELF文件
其次,新的进程通过调用execve()系统调用来执行指定的ELF文件。
-
加载ELF文件到内存
execve()系统调用会将ELF文件的相关信息传递给内核,内核会将ELF文件加载到内存中。
-
设置程序执行环境
内核会为程序设置执行环境,包括程序的代码段、数据段和堆栈段。
-
开始执行程序
最后,内核会将程序的控制权交给程序的入口函数,程序开始执行。
程序运行过程
当程序开始执行时,它会从入口函数开始执行。入口函数通常是名为main()的函数。main()函数会调用其他函数来完成程序的具体功能。
程序在执行过程中需要使用内存来存储数据和代码。程序的代码段存储在内存中,而程序的数据段和堆栈段则是在程序运行时动态分配的。
当程序执行完成后,它会调用exit()系统调用来终止自身。内核会回收程序占用的内存空间,并将程序的状态返回给父进程。
ELF文件格式
ELF文件格式是一种可执行文件格式,它被广泛用于Linux和Unix系统。ELF文件格式包括以下几个部分:
-
文件头
文件头包含有关ELF文件的基本信息,如文件类型、目标机器类型、入口函数地址等。
-
程序头表
程序头表包含有关ELF文件各段的信息,如段的类型、大小、偏移量等。
-
节头表
节头表包含有关ELF文件各节的信息,如节的类型、大小、偏移量等。
-
节数据
节数据包含ELF文件的实际数据,如代码、数据、符号表等。
程序终止
当程序执行完成后,它会调用exit()系统调用来终止自身。内核会回收程序占用的内存空间,并将程序的状态返回给父进程。
程序还可以通过其他方式终止,例如收到信号或发生异常。当程序收到信号时,它会执行相应的信号处理函数。当程序发生异常时,它会跳转到异常处理程序。
核心转储
当程序异常终止时,内核会创建一个核心转储文件。核心转储文件包含程序在异常终止时的内存映像。核心转储文件可以帮助程序员分析程序的异常情况。
内存映射
内存映射是一种将文件映射到内存中的技术。当文件被映射到内存中时,程序可以直接访问文件的内存映像,而无需通过文件系统来读取文件。
内存映射可以提高程序的性能,因为程序可以更快地访问文件中的数据。
总结
本文详细了在Linux操作系统中,当用户在bash中输入命令执行某个ELF可执行文件时,系统如何进行程序装载和运行。从用户层面到系统调用,再到ELF文件格式的解读,深入剖析了程序执行的整个过程。同时,还介绍了程序终止、核心转储和内存映射等相关知识,帮助读者深入理解程序在计算机中的运行机制。