Operating system C程序对CPU和OS的依赖性

Operating system C程序对CPU和OS的依赖性,operating-system,dependencies,cpu,Operating System,Dependencies,Cpu,让我们考虑一个在Windows中编译的简单C程序 我可以在Intel CPU机器上编译程序,并在AMD CPU one(相同的操作系统)上运行它。那么这是否意味着CPU的指令集是相同的呢 为什么同一个程序不能在具有不同操作系统和相同CPU的机器上运行 它们是相同的,或者至少您的程序只使用一个公共子集 关于第二个问题,一些常见的原因包括: 不同的操作系统需要不同格式的可执行文件 不同的操作系统通常具有不同的功能供程序使用 不同的操作系统使用不同的方式调用它们提供的内容 1) Intel CPU和A

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

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

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


  • 它们是相同的,或者至少您的程序只使用一个公共子集

    关于第二个问题,一些常见的原因包括:

  • 不同的操作系统需要不同格式的可执行文件
  • 不同的操作系统通常具有不同的功能供程序使用
  • 不同的操作系统使用不同的方式调用它们提供的内容
  • 1) Intel CPU和AMD CPU都是故意以这种方式生产的。你不能跑 在ARM CPU上为SPARC CPU编译的程序

    2) 理论上可以。比如说,Linux有这个东西来模拟Windows。
    许多Windows程序在Wine环境下的Linux上都能完美运行。

    英特尔和AMD处理器系列通常在它们实现的指令集上有很大的重叠(例如,有时一方发明了一些新东西,在另一家公司赶上之前会有一段距离),这就是为什么可以在这两种体系结构上运行程序的原因。这也是您不能在其他CPU架构上运行它的原因——它们没有相同的启动指令集,但有许多不同之处

    操作系统也有不同之处。例如,在Windows下编译程序时,通常会得到一个.exe文件。该.exe的格式只有Windows才能理解,并且与Linux使用的格式非常不同,例如

    此外,操作系统提供的支持完全不同——与OpenBSD相比,Windows有不同的内核函数可供调用。即使在更抽象的层面上,它也是不兼容的。例如,Windows使用驱动器号,如C:\、D:\等来标记驱动器,而在Linux下,它是一个大文件系统,您可以在其中安装不同的分区,例如在/media下等等

    有不同的尝试,例如Wine和Cygwin,从一个平台在另一个平台上执行程序。使用Wine,您可以直接在Linux上执行Windows可执行文件,因为它试图模拟Windows提供的功能(但并非所有功能都能正常工作)。Cygwin是一个不同的产品——你可以在Linux上运行与GNU程序类似的Windows程序,但它们需要经过专门编译——只是给你一个提示,这只是两个世界

    这就是为什么Java和.NET(Linux上支持Mono)试图将两者结合在一起。当您制作Java应用程序时,您应该能够在Linux上用或多或少相同的代码运行它-有些东西可能不一样,但大多数是一样的。

    关于2),请参阅的答案