在用户态应用程序处理的任务中,elf 加载运行是一个比较重要的步骤,下面就分析一下在 rt-smart 操作系统中,想要将一个应用程序运行起来要经过哪些步骤。
ELF 格式介绍
ELF 代表 Executable and Linkable Format。它是一种对可执行文件、目标文件和库使用的文件格式。它在 Linux 下成为标准格式已经很长时间,ELF 一个特别的优点在于,同一文件格式可以用于内核支持的几乎所有体系结构上。
RT-SMART 同样也使用 ELF 作为可执行文件的格式,下面简单介绍一下 ELF 文件格式。
ELF 文件布局和结构
下图为 ELF 文件的基本布局:

上图展示了 elf 文件的重要组成部分:
elf 文件头,除了用于标识ELF文件的几个字节之外,ELF头还包含了有关文件类型和大小的有关信息,
及文件加载后程序执行的入口点信息。
程序头表(program header table)向系统提供了可执行文件的数据在进程虚拟地址空间中组织
方式的相关信息。它还表示了文件可能包含的段数目、段的位置和用途。
各个段保存了与文件相关的各种形式的数据。例如,符号表、实际的二进制码、固定值(如字
符串)或程序使用的数值常数。
节头表(section header table)包含了与各段相关的附加信息。
使用 readelf 工具可以读取该类型文件中的各种数据结构。
关键数据结构
想要理解应用程序的加载运行过程,就必须要先了解 ELF 文件中的关键数据结构,知道可以通过 ELF 文件获取那些程序加载所必须的关键信息,例如文件类型、目标体系架构、版本号、程序入口点以及程序运行所需要的数据段存储在什么位置等等信息。这些信息都存放在 ELF 的相关数据结构中,那么现在就先了解一下 ELF 文件的相关数据结构吧。
下面是在 ELF 加载过程上下文数据结构,这个结构中包括了 eheader、pheader 和 sheader 三个 elf 的关键数据结构。
elf 头表
1typedef struct
2{
3 unsigned char e_ident[EI_NIDENT]; /* 前四个字节为 0x7f E L F,其他的字节位置都有特定的语义 */
4 Elf64_Half e_type; /* 用于区分 ELF 的文件类型,例如可重定位、可执行、动态库、core dump 文件 */
5 Elf64_Half e_machine; /* 指定了文件所需的体系结构 */
6 Elf64_Word e_version; /* 保存了版本信息,用于区分不同的 ELF 变体,目前该规范只定义了版本 1 */
7 Elf64_Addr e_en

本文详细分析了在 RT-Smart 操作系统中,如何将一个 ELF 格式的应用程序加载并运行起来的过程。从 ELF 文件的结构、关键数据结构到加载执行的具体步骤,包括检查文件头、处理程序头表和节头表,以及如何在用户空间分配地址等,全面阐述了程序启动运行的机制。
最低0.47元/天 解锁文章
626

被折叠的 条评论
为什么被折叠?



