Operating system 可执行文件的指令指向哪里?

Operating system 可执行文件的指令指向哪里?,operating-system,system-calls,cpu-architecture,x86,Operating System,System Calls,Cpu Architecture,X86,请不要标记为重复:我知道可执行文件us.exe是机器语言(二进制)中的一组指令,但我不知道这些指令是针对系统(然后针对内核)然后针对CPU,还是直接由CPU从内存中读取?我有点困惑安排可执行文件运行是由进程加载器完成的,通常是UI外壳的一部分或由UI外壳执行 exe文件包含头元数据和可执行代码 加载程序读取可执行文件头,分配进程需要运行的内核和其他资源的初始工作集,并创建一个线程以在进程入口点运行代码。如果加载程序没有将该代码读入内存,它将在pault加载它的立即页面中发生 然后该进程就存在了,

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

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

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

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

然后该进程就存在了,一个线程正在运行它


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

您的问题以错误开始

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

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

程序或库将具有以下数据:

  • 只读
  • 读写
  • 读写初始化为零
  • 执行
链接器通常将程序的各个部分组织在与这些组相对应的程序段中

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

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

可执行文件还将定义需要加载的动态库和地址修复(需要修复的地址,取决于加载的位置)


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

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

因此,操作系统为在该可执行文件(或与POSIX系统调用相当的Windows)上运行的进程设置了一个新的虚拟地址空间。它将可执行文件的页面映射到该虚拟地址空间,然后跳转到入口点(使用一条特殊的跳转指令,该指令会删除内核模式权限,如
iret
sysreturn
on)

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


在进程发出系统调用或中断到达之前,不会运行内核代码。(例如,计时器中断,此时内核可能会决定进程已经拥有了自己的CPU份额,并将上下文切换到另一个进程)。

即使我不知道加载程序是什么(我认为它是操作系统的一部分),也不知道线程是什么,我可以清楚地看到,操作系统通过准备内存为CPU运行指令设置了表格,对吗?@MekacherAnis本质上是的:)所以你基本上是说,可执行文件包含了它的指令需要如何在内存中布局的信息,这些信息是特定于平台的(由链接器设置)而作为操作系统一部分的加载器处理它们,我说得对吗?请回答我?链接器将在可执行文件的程序部分中列出机器指令。可执行文件告诉我们如何加载这些程序段,并在必要时进行修复。这就是为什么windows可执行文件不能在liunx机器上工作的原因,因为可执行文件包含windows loader必须处理的不同类型的指令,对吗?是的。即使指令在WINOZE和Linux机器上执行,可执行文件也因为可执行的格式而不兼容(以及它们如何链接到其他库和系统服务)。谢谢解释,但我只是NoOB,我不理解大多数词汇和操作系统的东西,就像我刚学习C++一样。简言之,你是什么意思?谢谢s@MekacherAnis:我的意思是CPU本身运行指令。内核并不是以每条指令为基础将它们提供给CPU。好吧,这是我的重述,告诉我什么是对的,什么是错的:可执行文件包含的指令告诉windows loader它应该如何在内存中布局,因此,在最后,这些指令首先进入操作系统,以便为CPU的工作准备环境,windows也负责释放内存,并作为补充说明,说明如何将其他库和系统服务链接到不同的操作系统。那么我说的对吗?谢谢,这是一个lot@MekacherAnis:听起来不错。不过,为了避免与x86机器指令混淆,你应该说“元数据”。thank’s man我虽然没有学习OSs,但至少我知道一点,thank’s,真的很抱歉再次提问,但是你能用外行的话解释一下64位、32位和thank’s之间的区别吗