可执行文件的指令在哪里?

时间:2016-03-15 10:00:49

标签: operating-system system-calls cpu-architecture

请不要标记为重复:我知道可执行文件,例如我们.exe是机器语言(二进制)中的一组指令,但我不知道这些指令是否针对系统(然后是内核)然后再到CPU或它们直接由CPU从内存中读取?我有点困惑

3 个答案:

答案 0 :(得分:2)

安排可执行文件运行由进程加载器完成,通常是UI shell的一部分或由UI shell执行。

exe文件包含标头元数据和可执行代码。

加载程序读取可执行文件头,分配内核的初始工作集和进程需要运行的其他资源,并创建一个线程以在进程入口点运行代码。如果加载器没有将该代码读入内存中,那么现在它将立即发生在页面库中加载它。

然后该过程存在,并且线程正在运行它。

总结:图像文件(Wondows中的.exe)包含用于OS加载程序和可执行代码解释的元数据。可执行代码指令由加载程序读入内存,CPU从内存中获取并执行这些指令。

答案 1 :(得分:1)

你的问题始于错误。

  

我知道像我们这样的可执行文件.exe是机器语言(二进制)中的一组指令

通常,可执行文件是指示如何将程序或库加载到内存中的指令集。 (有些可执行文件作为内存加载到内存中,但通常用于操作系统和嵌入式系统。)

程序或库将包含以下数据:

  • 只读
  • 读写
  • 读写初始化为零
  • 执行

链接器通常在与这些组对应的程序部分中组织程序的各个部分。

程序加载读取可执行文件中的指令并创建这些部分。对于只读数据,加载程序创建适当的页面,将数据加载到它们中,并将页面标记为读写。有些系统实际上将内存页面直接映射到可执行文件,并使用可执行文件来分页这些部分。

对于读写,初始化为零的部分,可执行文件不需要包含数据。我只需要告诉加载器创建页面并将所有内容设置为零。

可执行文件还将定义需要加载的动态库并解决修复问题(需要修复的地址,具体取决于加载的位置)。

如果可执行文件定义了一个程序(而不是一个库),它将指示程序的起始地址,以便它可以执行。

答案 2 :(得分:1)

可执行文件有一堆元数据告诉操作系统如何将其映射到内存,以及它需要哪些库。 (其他答案很好地涵盖了这一点)。

因此,操作系统为在此可执行文件(或Windows等效的POSIX系统调用)上运行% comm -13 <(sort f1.txt) <(sort f2.txt) 0.000185740873681 0.007314889610240 0.011287502580049 0.028083838182834 0.219960404756292 130695515 13483011 13497795 13512752 13512755 的进程设置了一个新的虚拟地址空间。它将可执行文件的页面映射到该虚拟地址空间,然后跳转到入口点(使用特殊的跳转指令删除内核模式权限,如上的execve(2)iret )。

此时,CPU正在用户空间进程中直接从内存中执行指令。该内存是磁盘上的内容的副本。 (见page cache)。

在进程进行系统调用或中断到达之前,内核代码不会运行。 (例如,定时器中断,此时内核可以决定该进程暂时拥有其CPU份额,并且上下文切换到不同的进程)。