Ton*_*ise 13 executable operating-system
像exe这样的可执行问题在Linux上没有用(没有wine).编译源代码时,编译器会生成特定于特定cpu体系结构的对象代码.但是同一个应用程序不适用于具有相同CPU的另一个OS.我知道代码可能包含特定于OS的指令,这些指令将阻止可执行运行.但是一个简单的程序2 + 2怎么样?令人困惑的部分是机器代码阻止工作的地狱.特定于cpu的机器代码对吗?如果我们剥离可执行文件格式,我们可以看到两个操作系统的相同机器代码(如2 + 2)吗?
还有一个问题:汇编语言怎么样?DO windows和Linux对同一个cpu使用不同的汇编语言吗?
Meh*_*ari 17
有很多不同之处.其中:
可执行格式:每个操作系统都要求二进制文件符合特定的二进制格式.对于Windows,这是可移植可执行(PE)格式.对于Linux,它大部分时间都是ELF(它也支持其他类型).
应用程序二进制接口:每个操作系统定义一组主要系统功能以及程序调用它们的方式.这在Linux和Windows之间根本不同.虽然计算2 + 2的指令在x86架构中的Linux和Windows上是相同的,但是应用程序启动的方式,打印输出的方式以及它的退出方式因操作系统而异.
是的,x86架构上的Linux和Windows程序都使用CPU支持的指令集,由Intel定义.
cod*_*zen 13
这是由于程序加载到内存和给定资源的运行方式不同.即使是最简单的程序也需要具有代码空间,数据空间以及获取运行时内存和执行I/O的能力.除非你有某种适应层,比如WINE或Cygwin,否则执行这些低级任务的基础设施在平台之间是完全不同的.
但是,假设您可以将任意组合的CPU指令注入正在运行的进程的代码段并获取该代码以执行,那么,是的,相同的代码将在任一平台上运行.但是,它会受到相当大的限制,并且由于在不同平台上以不同方式执行这些操作,执行复杂的操作(例如甚至跳转到外部模块)都会失败.
问题1是图像格式。当应用程序启动执行时,操作系统必须加载应用程序映像,找到它的入口点并从那里启动它。这意味着操作系统必须了解图像格式,并且各种操作系统之间存在不同的格式。
问题 2 是对设备的访问。一旦启动,应用程序就可以在 CPU 中读写注册表,仅此而已。为了做任何有趣的事情,比如在控制台上显示一个字符,它需要访问设备,这意味着它必须从操作系统请求这样的访问。每个操作系统都有一个不同的 API 来访问这些设备。
问题 3 是权限说明。新启动的进程可能需要一个内存位置来存储一些东西,不能用注册表完成所有事情。这意味着它需要分配 RAM 并设置从 VA 到物理地址的转换。这些是只有操作系统才能执行的特权操作,而且访问这些服务的 API 因操作系统而异。
底线是应用程序不是为 CPU 编写的,而是为操作系统提供的一组原始服务编写的。另一种方法是针对虚拟机提供的一组原始服务编写应用程序,这会导致应用程序或多或少具有可移植性,例如 Java 应用程序。