注意:本文中的大部分是阅读 《程序员的自我修养》 作 者:俞甲子,石凡,潘爱民 的读书笔记。推荐大家看看这本书。
Linux操作系统下,我们在bash进程中,输入命令后,bash进程调用fork创建新进程,新进程调用execve()系统调用执行指定ELF文件,原先的bash进程继续返回等待刚开启的进程结束,然后继续等待用户输入。新进程使用execve系统调用。这个调用的原型为:
int execve(const char *filename ,char *const argv[],char *const envp[])。参数即执行的程序文件名、执行参数和环境变量。Glibc对其进行了封装,提供了execl、execlp、execle、execv、execvp等不同形式的exec系列API。
以下是miniBash的代码。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
char buf[1024];
pid_t pid;
while(1){
printf("miniBash$");
scanf("%s",buf);
pid=fork();
if(pid==0){
if(execlp(buf,0)<0){
printf("exec error\n");
}
}else if(pid>0){
int status;
waitpid(pid,&status,0);
}else{
printf("fork error%d\n",pid);
}
}
return 0;
}
execve()系统调用的入口是sys_execve(),其在arch\i386\kernel\Process.c中,sys_execve进行参数检查复制后,调用do_execve()。其首先查找被执行的文件,如果找到,读取其前128字节,以判断文件是Java还是Windows PE,还是Linux ELF
等(通过魔数判断),例如ELF的头4个字节为0x7F,Java为cafe,Shell则由于其第一行一般是#!/bin/sh,所以前两个字节是#和!。
当do_execve获取这128字节文件头部后,调用search_binary_handle()搜索和匹配合适的可执行文件装载处理程序,通过上述判断魔数,获知调用对应的处理过程,比如ELF的处理过程为load_elf_binary();Shell脚本则是load_script()。
load_elf_binary被定义在fs/Binfmt_elf.c。
其主要步骤为:
1,检查ELF文件有效性
2,寻找动态链接的“.interp”段,设置动态链接器路径。
3,根据ELF程序头表,对ELF文件进行映射
4,初始化进程环境,比如EDX寄存器是否是DT_FINI的地址(动态链接)
5,将系统调用返回地址初始化为ELF文件入口地址,对于静态链接的ELF可执行文件即ELF文件头的e_entry,动态链接的ELF可执行文件,则是动态链接器。
当load_elf_binary返回、do_execve返回到sys_execve(),系统调用返回地址已经被第5步改成了ELF文件入口。sys_execve()返回到用户态,EIP寄存器是ELF程序入口,程序开始执行。
分享到:
相关推荐
ELF(Executable and Linkable Format)文件格式是Linux操作系统中广泛使用的可执行文件、共享库和对象文件的格式。它是UNIX系统实验室(USL)为了实现应用程序二进制接口(ABI)而设计的一种标准化格式,并被TIS...
9. **系统运行**:至此,Linux操作系统基本启动完毕,用户可以登录并进行日常操作。 整个过程中,MMU、ELF和Linux启动的每个阶段都至关重要,它们相互配合,确保了系统的稳定运行。理解这些概念和技术,对于深入...
在嵌入式Linux系统中,U-Boot扮演着桥梁的角色,连接硬件与操作系统,确保系统能够正确启动。 移植U-Boot涉及以下几个关键步骤: 1. **环境搭建**:首先,你需要配置一个合适的交叉编译环境,包括选择适当的GCC...
ELF,全称Executable and Linking Format,是一种在多种UNIX系统以及Linux操作系统中广泛使用的可执行文件、目标文件和共享库的标准文件格式。它由UNIX System Laboratories(USL)开发,提供了比传统的a.out和COFF...
【工业互联网安全测试技术:Linux操作系统】 Linux操作系统是工业互联网领域中的重要组成部分,因其开源、稳定和可定制的特性,广泛应用于各种工业控制设备和嵌入式系统中。Linux是一种类UNIX操作系统,遵循POSIX...
ELF格式最初由Unix系统实验室(USL)定义,用于替代旧的a.out和COFF格式,如今广泛应用于各种Unix和Unix-like操作系统,包括Linux、Solaris和FreeBSD等。 ELF文件格式的目的是为了提供一个标准的方式,以存储程序...
ELF格式是一种广泛应用于Unix/Linux操作系统上的二进制文件格式标准,它不仅支持可执行文件,还支持共享库和目标文件等。对于Android开发人员而言,了解So文件内部结构有助于更好地进行性能优化、调试及安全性分析等...
**Arm+Linux系统移植**是将Linux操作系统适配到基于ARM架构的目标硬件平台上的一项技术工作。这项工作不仅包括了软件层面的操作系统移植,还涉及到了硬件环境的搭建、工具链的配置等多个方面。 #### 二、硬件与软件...
**Linux系统移植**是指将Linux操作系统从一种硬件架构转移到另一种硬件架构上的过程。这一过程不仅涉及底层硬件的适配,还包括对软件环境(如编译器、库等)进行调整以确保能够在新的硬件平台上正常运行。 #### 二...
这本书详细介绍了Linux操作系统的核心概念、API以及如何利用这些工具来构建复杂的软件系统。以下是该书可能涵盖的一些关键知识点: 1. **Linux系统架构**:介绍Linux系统的层次结构,包括内核、用户空间、进程、...
首先,我们要理解Linux操作系统的核心概念。Linux是一种开源的操作系统,其内核由林纳斯·托瓦兹创建,它遵循POSIX标准,因此在Linux上进行的许多编程工作都与Unix系统兼容。了解Linux的文件系统层次结构标准(FHS)...
Linux内核的启动是一个复杂且关键的过程,涉及硬件初始化、操作系统核心加载以及系统初始化等步骤。针对ARMLinux内核的启动流程,本文档将深入探讨非压缩内核映象与压缩内核映象的生成过程及其启动机制。 #### 二、...
Linux 操作系统一直被认为是安全的操作系统,但随着越来越多的服务器、工作站和个人电脑使用 Linux 软件,电脑病毒制造者也开始攻击这一系统。 Linux 系统的安全性和权限控制都是比较强大的,这主要得力于其优秀的...
#### 一、Linux操作系统的安装及配置 ##### 1. 如何安装RedHat 9.0 对于初次接触Linux尤其是Red Hat 9.0的用户来说,安装过程可能会显得有些复杂。不过,通过遵循下面的步骤,可以较为顺利地完成安装: - **设置...
- **Linux操作系统:** 更适合进行嵌入式开发,便于管理和配置交叉编译环境。 - **目标板最后运行的环境:** 需要在目标板上运行一个支持Linux系统的环境。 - **Linux下工作用户及环境:** - **交叉工具的安装:**...
- **附录E:ELF二进制格式**:介绍了Linux常用的ELF文件格式,这对于理解程序的链接和装载过程非常重要。 - **附录F:内核开发过程**:给出了一个完整的Linux内核开发周期示例,包括需求分析、编码、测试等环节。 #...
- **操作系统概述**:操作系统作为连接硬件和应用程序的桥梁,其核心任务是管理和调度系统资源。 - **进程管理**:深入剖析进程的概念、状态变化、调度策略等。 - **内存管理**:讲解虚拟内存机制、分页与分段技术、...