可执行文件的装载与执行
一、进程虚拟地址空间
区分“程序虚拟地址空间的寻址范围”、“程序可以使用的虚拟地址空间”和“程序可以使用的内存空间”:
1. “程序虚拟地址空间的寻址范围”、“程序可以使用的虚拟地址空间”:
32位CPU只能使用32位指针。最大寻址范围是0~4GB;在Linux下最多可以使用3GB空间(1GB留给OS),在Windows下最多可以使用2GB(2GB留给OS)或3GB(1GB留给OS)
2. “程序可以使用的内存空间”:
Intel从1995年的Pentium Pro CPU开始使用36位地址线(可访问高到64GB物理内存),程序虽然还是只有32位的地址空间,但是可以从高于4GB的物理空间中申请多个大小为256MB的物理空间块。这种地址扩展称“PAE (Physical Address Extension)”.
二、装载的方式
1. 覆盖装入(已淘汰):需要程序员手工将模块按照它们之间的调用依赖关系组织成树状结构。
2. 页映射:
下图中P0~P7是“进程虚拟地址空间”中的“虚拟页”(VP, Virtual Page),右边F0~F3是“内存”中的“物理页”(PP, Physical Page)。“OS”中的“存储管理器”需要管理调入缺少虚拟页到物理页等。
查看“页的大小”: $getconf PAGE_SIZE
查看“OS位数”:$getconf LONG_BIT
查看“CPU位数”: $arch ==> i686或x86_64则表明机器是64位的
三、从操作系统的角度看可执行文件
由于使用了“分页机制” ,所以提到“可执行文件的装载”并不是一次性完成的,而是分了两步:
1. 进程建立时,为“分页装载”做了一些准备,还未真正装载; (1)(2)(3)
(1)分配一个页目录Page Directory,用来记录Virtual Page(进程虚拟地址空间中)到Physical Page(内存中)的映射关系。等执行时发生缺页(Page Fault)时,由OS安排处理调用、填充页目录等。
(2)在进程数据结构中构造一些VMA(Virtual Memory Area),VMAs保存了Disk Page(磁盘上的可执行文件中)到Virtual Page(进程虚拟地址空间中)的映射关系。注:VMA是OS内部的一个数据结构。
(3)将CPU指令寄存器设置为可执行文件入口,启动运行
2. 缺页(产生页错误)时,才真正地去装载。(4)
(4)缺少进程虚拟空间的某个VP时,
分配一个物理页PP;
查询VMA,将该VP对应的DP装入PP;
在目录表Page Dir中添加一个“VP->PP”的对应关系。
四、进程虚存空间分布
1. ELF文件的链接视图和执行视图
ELF文件中,段(Section)的权限往往只有以下三种:
(1) 可读可执行的 代码段; (2) 可读可写的 数据段和BSS段; (3) 只读的 只读(数据)段。
在装载ELF可执行文件时,对于相同权限的Section,把它们合并为一个Segment进行映射。ELF可执行文件中有一个专门的数据结构用来保存Segment的信息,叫做“程序头表 Program Header Table”。因为ELF目标文件不需要被装载,所以没有程序头表;而ELF可执行文件和共享库文件都有程序头表。
Segment和Section是从不同角度划分同一个ELF文件。从Section的角度来看ELF文件就是链接视图Linking View;而从Segment的角度来看就是执行视图Execution View。
2.
五、Linux内核装载ELF过程
在Linux的bash下输入一个命令执行某个ELF程序时,
(1) bash进程会调用fork()系统调用创建一个新的进程;
(2) 新的进程调用int execve(const char* filename, char* const argv[], char* const envp[])系统调用执行指定的ELF文件。
下面使用fork()和execve()实现一个简易的bash:
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(){ char buf[1024]={0}; pid_t pid; while(1){ printf("minibash$"); scanf("%S", buf); pid=fork(); if(pid==0){ //是对execve()的封装,执行指定的ELF可执行文件 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); } } }
注:在这里可以见fork()详解——http://blog.csdn.net/jason314/article/details/5640969
六、Windows PE的装载
相关推荐
4. **链接与装载**:解释链接器的工作原理,如何将编译后的对象文件合并成可执行文件,以及装载器如何将可执行文件加载到内存中运行。 5. **设备驱动程序**:阐述设备驱动程序的功能,它是操作系统与硬件之间的桥梁...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用...
ELF格式是一种广泛应用于Unix/Linux操作系统上的二进制文件格式标准,它不仅支持可执行文件,还支持共享库和目标文件等。对于Android开发人员而言,了解So文件内部结构有助于更好地进行性能优化、调试及安全性分析等...
介绍了程序的链接过程,如何将多个汇编模块组合成一个可执行文件,以及程序在内存中的装载过程。 第八章:系统调用与中断处理 系统调用是程序与操作系统交互的重要手段,本章会讲解如何在汇编中实现系统调用,以及...
"计算机操作系统第六章2022优秀文档.ppt" 本资源是计算机操作系统的第六章,主要讲解了操作系统的存储管理技术,包括覆盖技术、交换技术、进程调出、进程调入和部分性原理等。下面是详细的知识点解释: 1. 覆盖...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用...
6. 将抽象或复杂的数值转换为用户可理解的形式。 7. 确定数据源,包括内部和外部源,以及数据仓库所需的所有目标数据。 8. 编写规程,管理数据缓存区域,使用检测工具,为聚集表制定计划,并定义数据转换和清洗规则...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用...
第11章 可执行文件的捆绑和分离 243 11.1 引言 243 11.2 捆绑方式分类 243 11.2.1 结合式捆绑 243 11.2.2 功能式捆绑 245 11.3 文件捆绑相关技术 245 11.3.1 文件捆绑工具及实现 245 11.3.2 木马程序与捆绑 ...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用loop指令实现酮循环程序 5.4 Debu9...
DBR是DOS引导记录,为操作系统进入文件系统以后可以访问的第一个扇区,通常用来解释文件系统,DBR是由硬盘的MBR装载的程序段。DBR装入内存后,即开始执行该引导程序段,其主要功能是完成操作系统的自举并将控制权...
6. **链接器与装载器**:在程序设计中,链接器将编译后的对象文件合并成一个可执行文件,而装载器则负责将这个文件加载到内存中并执行。了解这两个过程有助于我们解决链接错误和运行时问题。 7. **调试技巧**:在...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用loop指令实现酮循环程序 5.4 Debu9...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用loop指令实现酮循环程序 5.4 Debu9...
4.8 谁将可执行文件中的程序装载进入内存并使它运行? 4.9 程序执行过程的跟踪 实验3 编程、编译、连接、跟踪 第5章 【BX】和loop指令 5.1 【BX】 5.2 Loop指令 5.3 在Debu9中跟踪用loop指令实现酮循环程序 5.4 Debu9...