返回

程序装载与运行中的那些事

闲谈

作为计算机系列文章的第六篇,我们来聊聊程序是如何装载和运行的。当我们使用电脑时,无论是打开文档、浏览网页还是运行程序,操作系统都会负责将这些文件装入内存并执行。

程序装载过程

在Linux系统中,当用户在bash中输入命令执行某个ELF可执行文件时,系统会经历以下步骤:

  1. 创建新进程

    首先,在用户层面,bash进程会调用fork()系统调用创建一个新的进程。

  2. 执行ELF文件

    其次,新的进程通过调用execve()系统调用来执行指定的ELF文件。

  3. 加载ELF文件到内存

    execve()系统调用会将ELF文件的相关信息传递给内核,内核会将ELF文件加载到内存中。

  4. 设置程序执行环境

    内核会为程序设置执行环境,包括程序的代码段、数据段和堆栈段。

  5. 开始执行程序

    最后,内核会将程序的控制权交给程序的入口函数,程序开始执行。

程序运行过程

当程序开始执行时,它会从入口函数开始执行。入口函数通常是名为main()的函数。main()函数会调用其他函数来完成程序的具体功能。

程序在执行过程中需要使用内存来存储数据和代码。程序的代码段存储在内存中,而程序的数据段和堆栈段则是在程序运行时动态分配的。

当程序执行完成后,它会调用exit()系统调用来终止自身。内核会回收程序占用的内存空间,并将程序的状态返回给父进程。

ELF文件格式

ELF文件格式是一种可执行文件格式,它被广泛用于Linux和Unix系统。ELF文件格式包括以下几个部分:

  1. 文件头

    文件头包含有关ELF文件的基本信息,如文件类型、目标机器类型、入口函数地址等。

  2. 程序头表

    程序头表包含有关ELF文件各段的信息,如段的类型、大小、偏移量等。

  3. 节头表

    节头表包含有关ELF文件各节的信息,如节的类型、大小、偏移量等。

  4. 节数据

    节数据包含ELF文件的实际数据,如代码、数据、符号表等。

程序终止

当程序执行完成后,它会调用exit()系统调用来终止自身。内核会回收程序占用的内存空间,并将程序的状态返回给父进程。

程序还可以通过其他方式终止,例如收到信号或发生异常。当程序收到信号时,它会执行相应的信号处理函数。当程序发生异常时,它会跳转到异常处理程序。

核心转储

当程序异常终止时,内核会创建一个核心转储文件。核心转储文件包含程序在异常终止时的内存映像。核心转储文件可以帮助程序员分析程序的异常情况。

内存映射

内存映射是一种将文件映射到内存中的技术。当文件被映射到内存中时,程序可以直接访问文件的内存映像,而无需通过文件系统来读取文件。

内存映射可以提高程序的性能,因为程序可以更快地访问文件中的数据。

总结

本文详细了在Linux操作系统中,当用户在bash中输入命令执行某个ELF可执行文件时,系统如何进行程序装载和运行。从用户层面到系统调用,再到ELF文件格式的解读,深入剖析了程序执行的整个过程。同时,还介绍了程序终止、核心转储和内存映射等相关知识,帮助读者深入理解程序在计算机中的运行机制。