请不要标记为重复:我知道可执行文件,例如我们.exe是机器语言(二进制)中的一组指令,但我不知道这些指令是否针对系统(然后是内核)然后再到CPU或它们直接由CPU从内存中读取?我有点困惑
答案 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
的进程设置了一个新的虚拟地址空间。它将可执行文件的页面映射到该虚拟地址空间,然后跳转到入口点(使用特殊的跳转指令删除内核模式权限,如x86上的execve(2)
或iret
)。
此时,CPU正在用户空间进程中直接从内存中执行指令。该内存是磁盘上的内容的副本。 (见page cache)。
在进程进行系统调用或中断到达之前,内核代码不会运行。 (例如,定时器中断,此时内核可以决定该进程暂时拥有其CPU份额,并且上下文切换到不同的进程)。