operating-system - 程序如何执行?操作系统在哪里发挥作用?

标签 operating-system cpu-architecture instruction-set platform-independence

程序从某种语言编译为 ASM --> 机器代码(直接可执行)。当人们说这取决于平台时,意味着形成的二进制文件将(正确)仅在具有相同指令集架构(如 x86、x86-64)的 CPU 上运行。由于 ISA 的不同,它可能(错误地)/可能(根本不)在其他进程上运行。对?

现在,二进制文件的概念让我感到困惑。一切都与“机器语言代码”和“CPU”有关。操作系统在哪里发挥作用?我的意思是编译后的二进制文件在加载到内存时有直接的 CPU 指令。 & CPU 一次执行一条指令。除了进程管理link text,我在任何地方都看不到操作系统的作用。 .无论操作系统如何,它都应该在相同 ISA 的 CPU 上运行。对?

然而事实并非如此。如果我在 Windows 机器上构建 x86 的代码。它不会在 Mac x86 机器或 Linux x86 机器上运行。

我在这里遗漏了一些东西。请清除我的困惑。

最佳答案

对于初学者来说,现代 CPU (至少)有两种模式,一种是运行操作系统本身的核心模式(“内核模式”),另一种是运行程序的模式(“用户模式”)。在用户模式下,CPU 不能做很多事情。

例如,在内核中通常会注意到鼠标单击,而不是用户模式。但是,操作系统将事件分派(dispatch)到用户模式并从那里分派(dispatch)到正确的程序。反过来也需要配合:一个程序不能自由地画到屏幕上,需要经过操作系统和内核模式才能画出自己的部分。

同样,启动程序的行为通常是一种合作。操作系统的外壳部分也是一个用户模式程序。它获取您的鼠标单击,并确定它是旨在启动进程的鼠标单击。然后外壳程序告诉操作系统的内核模式部分为该程序启动一个新进程。

当内核态需要启动一个新进程时,它首先分配内存用于记账,然后继续加载程序。这涉及从二进制文件中检索指令,还包括将程序连接到操作系统。这通常需要找到二进制文件的入口点(经典 int main(int argc, char** argv)),以及程序要调用操作系统的所有点。

不同的操作系统使用不同的方式将程序与操作系统 Hook 。因此,加载过程不同,二进制文件的文件格式也可能不同。这不是绝对的;二进制文件的 ELF 格式用于许多操作系统,Microsoft 在其所有当前操作系统上使用其 PE 格式。在这两种情况下,格式确实描述了二进制的精确格式,因此操作系统可以决定程序是否可以连接到操作系统。例如,如果它是 Win32 二进制文件,它将是 PE 格式,因此 Linux 不会加载它,Windows 2000 会加载,Windows 7-64 也会加载。另一方面,Win64 二进制文件也是 PE 格式,但 Windows 2000 会拒绝它。

关于operating-system - 程序如何执行?操作系统在哪里发挥作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1599434/

相关文章:

linux - 进程的虚拟地址范围

cpu - 指令集随机化的大致工作原理

c++ - 用于检测 BMI2 指令集的编译器宏

linux - Windows 内存页面是否始终以 4096 字节为单位?

operating-system - 父进程在写时复制期间会失去写能力吗?

algorithm - 如何实现循环算法?

c - 按位运算帮助/建议

performance - 为什么未对齐的地址访问会导致 2 次或更多次访问?

cpu-architecture - RISC-V 与其他 ISA 之间的差异

gcc - 如何限制 GCC 中的自动矢量化级别?