Operating system 机器独立性

Operating system 机器独立性,operating-system,hardware,computer-architecture,Operating System,Hardware,Computer Architecture,让我们考虑一个在Windows中编译的简单C程序 我可以在Intel CPU机器上编译程序,并在AMD CPU one(相同的操作系统)上运行它。那么这是否意味着CPU的指令集是相同的呢 为什么同一个程序不能在具有不同操作系统和相同CPU的机器上运行?目标文件的二进制设置完全不同。还有哪些库可用或如何调用它们 只要比较一下ELF或EXE文件的头,看看我的意思 如果您编写一个简单的程序,如“main(){printf(“Hello\n”);return 0;},编译器会在后台进行大量工作,以打印这

让我们考虑一个在Windows中编译的简单C程序

我可以在Intel CPU机器上编译程序,并在AMD CPU one(相同的操作系统)上运行它。那么这是否意味着CPU的指令集是相同的呢


为什么同一个程序不能在具有不同操作系统和相同CPU的机器上运行?

目标文件的二进制设置完全不同。还有哪些库可用或如何调用它们

只要比较一下ELF或EXE文件的头,看看我的意思

如果您编写一个简单的程序,如“main(){printf(“Hello\n”);return 0;},编译器会在后台进行大量工作,以打印这些行。在同一个CPU上运行没有帮助,因为它可以执行汇编指令,但一旦调用第一个OS函数,它就会失败

要详细说明一下这一点:

就像一个exmaple。让我们假设我们运行的是一个摩托罗拉68000 CPU的Amiga操作系统

如果我没记错的话,调用系统库的调用转换涉及将指针加载到CPU的地址寄存器中,然后调用OS函数

现在让我们假设我也使用Motorola 68000 CPU编写我自己的操作系统。然而,当我设计我的操作系统时,我认为使用堆栈进行数据交换是一个更好的主意,因此当你在我自己的私有操作系统中调用类似的函数时,你不会在地址寄存器中传递地址,而是将它推到堆栈上。 现在,当您的可执行文件在我的操作系统中执行时(假设它可以加载,因为我使用相同的对象结构),您的可执行文件会将值放入寄存器,我的操作系统会尝试将它们从堆栈中弹出,因为它不知道它要查找的值应该是其他值


我希望这更详细一点,以便您能理解它,但当然问题比这更深,因为这只是所涉及问题的一小部分。

目标文件的二进制设置完全不同。还有哪些库可用或如何调用它们

只要比较一下ELF或EXE文件的头,看看我的意思

如果您编写一个简单的程序,如“main(){printf(“Hello\n”);return 0;},编译器会在后台进行大量工作,以打印这些行。在同一个CPU上运行没有帮助,因为它可以执行汇编指令,但一旦调用第一个操作系统函数,就会出现可怕的失败

要详细说明一下这一点:

就像一只枫树。让我们假设我们运行的是带有摩托罗拉68000 CPU的Amiga操作系统

如果我没记错的话,调用系统库的调用转换涉及将指针加载到CPU的地址寄存器中,然后调用OS函数

现在让我们假设我也使用摩托罗拉68000 CPU编写自己的操作系统。然而,当我设计我的操作系统时,我认为使用堆栈进行数据交换是一个更好的主意,因此,当你在我自己的私有操作系统中调用类似的函数时,你不在地址寄存器中传递地址,而是将它推到堆栈上。 现在,当您的可执行文件在我的操作系统中执行时(假设它可以加载,因为我使用相同的对象结构),您的可执行文件会将值放入寄存器,我的操作系统会尝试将它们从堆栈中弹出,因为它不知道它要查找的值应该是其他值


我希望这更详细一点,以便您能够理解它,但当然问题比这更深,因为这只是问题的一小部分。

您的英特尔和AMD都使用x86(或x86-64)体系结构。这就是为什么您可以在这两个服务器上运行相同的软件。然而,编译后的程序不仅包含对体系结构的依赖,还包含对底层操作系统的依赖。例如,即使是Linux可执行文件的二进制格式也不同于Windows可执行文件

但是,您可以使用一个使用C标准库的简单C程序,并跨不同的操作系统和处理器体系结构编译它。只要代码不包含依赖于操作系统的代码,它就会跨操作系统进行移植。类似地,如果您的代码不依赖于底层架构的端性,例如,它将跨架构进行移植


Johan.

您的Intel和AMD都使用x86(或x86-64)体系结构。这就是为什么您可以在这两个服务器上运行相同的软件。然而,编译后的程序不仅包含对体系结构的依赖,还包含对底层操作系统的依赖。例如,即使是Linux可执行文件的二进制格式也不同于Windows可执行文件

但是,您可以使用一个使用C标准库的简单C程序,并跨不同的操作系统和处理器体系结构编译它。只要代码不包含依赖于操作系统的代码,它就会跨操作系统进行移植。类似地,如果您的代码不依赖于底层架构的端性,例如,它将跨架构进行移植


Johan。

用一个例子编辑了这篇文章来说明我的意思。哦,很好的插图。嘿,你知道什么好书可以从机器层面(数字逻辑)了解计算机是如何工作的吗?我想补充一点,原因是操作系统尽其所能提供硬件抽象。特别是出于方便、便携性和安全性的原因。对不起,我不能从我的头脑中推荐一个。我会寻找“冯·诺依曼体系结构”来帮助您入门,或者寻找关于操作系统设计的书籍。这个问题相当广泛,因此建议也可能取决于您预期的体系结构。用示例编辑文本以说明我的意思。哦,很好的说明..嘿,您知道有什么好书可以从机器级别了解计算机是如何工作的吗