【发布时间】:2011-01-04 02:51:13
【问题描述】:
可执行文件实际上包含什么? .. 它是否包含以 Opcode 和 Operands 形式发送给处理器的指令?如果是这样,为什么我们对不同的操作系统有不同的可执行文件?
【问题讨论】:
可执行文件实际上包含什么? .. 它是否包含以 Opcode 和 Operands 形式发送给处理器的指令?如果是这样,为什么我们对不同的操作系统有不同的可执行文件?
【问题讨论】:
处理器根据操作码理解程序 - 因此您对包含操作码的可执行文件的直觉是正确的,并且您猜对了,任何可执行文件都必须具有操作码和操作数才能在处理器上执行程序。
但是,程序大多在操作系统的帮助下执行(您可以编写不使用操作系统执行的程序,但这将是很多不必要的工作)——它在程序的硬件之上提供抽象可以使用。操作系统负责为要运行的任何程序设置“上下文”,即为程序提供所需的内存,提供程序可用于执行常见操作(例如写入文件、打印到控制台等)的通用库。
但是,要为程序设置上下文(为其提供内存、加载其数据、为其设置堆栈),操作系统需要读取程序的可执行文件并需要了解有关程序的一些信息,例如作为程序期望使用的数据,该数据的大小,存储在该数据区域中的初始值,构成程序的操作码列表(也称为进程的文本区域),它们的大小等。这些数据和更多(调试信息、只读数据,如程序中的硬编码字符串、符号表等)存储在可执行文件中。每个操作系统都理解这个可执行文件的不同格式,因为他们希望所有这些信息以不同的方式存储在可执行文件中。查看 Groo 提供的链接。
用于在可执行文件中存储信息的几种格式是 UNIX 系统上的 ELF 和 COFF 以及 Windows 上的 PE。
附: - 并非所有程序都需要可执行格式。在 Google 上查找引导加载程序。这些是占用硬盘上可引导分区的第一个扇区的特殊程序,用于加载操作系统本身。
【讨论】:
是的,操作码和操作数形式的代码,当然还有数据。你想做的任何涉及操作系统的事情都取决于操作系统,而不是 CPU。这就是为什么您需要针对不同操作系统的不同程序。在 Windows 中打开窗口与在 Linux 中的指令顺序不同,依此类推。
【讨论】:
.com 文件是可执行程序的最后残余,它们只是操作系统将文件加载到内存中的代码和数据,将 IP 指向那里并让它运行:-)
正如unwind 在他的回答中暗示的那样,可执行文件包含对操作系统中例程的调用。
对于一个可执行文件来说,尝试实现操作系统已经提供的功能(例如,写入磁盘、接受输入)是非常低效的,因此大量使用对操作系统功能的调用。
不同的操作系统提供的函数做类似的事情,但是如何调用这些函数的细节(以及它们在哪里)可能不同。
因此,除了处理器类型的主要差异之外,为一个操作系统编写的可执行文件不能与另一个操作系统一起工作。
【讨论】:
要执行任何形式的 IO,可执行文件需要使用系统调用与操作系统交互。在 Windows 中,这些是对 Win32 API 的调用,而在 linux/unit 上,这些主要是 posix 调用。
此外,可执行文件格式因操作系统而异,就像 PNG 文件与 GIF 文件不同一样。数据排序不同,并且有不同的标题和子标题。
【讨论】:
一个可执行文件包含多个数据块以及有关如何将数据加载到内存中的说明。其中一些部分恰好包含可以执行的机器代码。其他部分包含项目数据、资源、搬迁信息、进口信息等。
【讨论】: