程序从某种语言编译为 ASM --> 机器代码(直接可执行)。当人们说这是平台相关时,意味着形成的二进制文件只能在具有相同指令集架构(如 x86、x86-64)的 CPU 上运行(正确)。由于 ISA 的差异,它可能(错误地)/可能(根本)不在其他进程上运行。正确的?
现在,二进制文件的概念让我感到困惑。一切都与“机器语言代码”和“CPU”有关。操作系统在哪里发挥作用?我的意思是,编译后的二进制文件在加载到内存中时有针对 CPU 的直接指令。 & CPU 一次执行一条指令。除了进程管理之外,我看不到操作系统的任何作用链接文本 http://upload.wikimedia.org/wikipedia/commons/8/83/Process_states.svg。无论操作系统如何,它都应该在相同 ISA 的 CPU 上运行。正确的?
但事实并非如此。如果我在 Windows 机器上构建 x86 的代码。它无法在 Mac x86 计算机或 Linux x86 计算机上运行。
我在这里缺少一些东西。请解开我的困惑。
对于初学者来说,现代 CPU(至少)有两种模式,一种是运行操作系统本身的核心的模式(“内核模式”),另一种是运行程序的模式(“用户模式”)。当处于用户模式时,CPU 无法执行很多操作。
例如,鼠标单击通常在内核中而不是在用户模式中被注意到。但是,操作系统将事件分派到用户模式,并从那里分派到正确的程序。反过来也需要合作:程序不能自由地在屏幕上绘图,而是需要通过操作系统和内核模式来在其部分上绘图。
同样,启动一个程序的行为通常也是一种合作。操作系统的外壳部分也是用户模式程序。它获取您的鼠标单击,并确定这是旨在启动进程的鼠标单击。然后 shell 告诉操作系统的内核模式部分为该程序启动一个新进程。
当内核态需要启动一个新进程时,它首先分配内存用于记账,然后继续加载程序。这涉及从二进制文件中检索指令,还将程序连接到操作系统。这通常需要找到入口点(经典的int main(int argc, char** argv)
)的二进制文件,以及程序想要调用操作系统的所有点。
不同的操作系统使用不同的方式将程序与操作系统连接起来。因此,加载过程不同,二进制文件的文件格式也可能不同。这不是绝对的;二进制文件的 ELF 格式用于许多操作系统,Microsoft 在其当前的所有操作系统上都使用其 PE 格式。在这两种情况下,格式确实描述了二进制文件的精确格式,因此操作系统可以决定程序是否可以连接到操作系统。例如,如果它是 Win32 二进制文件,它将采用 PE 格式,因此 Linux 不会加载它,Windows 2000 会加载,Windows 7-64 也会加载。另一方面,Win64 二进制文件也是 PE 格式,但 Windows 2000 会拒绝它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)