Rya*_*anW 5 linux windows operating-system kernel
因此,根据我的理解,有两种类型的程序,即解释的程序和编译的程序.解释程序由解释程序执行,解释程序是其所在平台的本机应用程序,而编译程序本身就是它们所在平台的本机应用程序(或系统软件).
但我的问题是:除了内核以外的任何东西实际上是由CPU直接运行的吗?Windows可执行文件是"Windows可执行文件",而不是x86或amd64可执行文件.这是否意味着所有其它进程,这不是内核字面上由内核在浏览器中的JavaScript解释以同样的方式解释?或者是内核将这些进程放在内核所在的"裸机"上?
如果他们使用"裸机",那么Windows是如何知道程序是Windows程序而不是Linux程序的,因为它们都是为amd64处理器编译的?如果是因为可执行文件的"格式",那么该可执行文件如何能够在"裸机"上运行,因为对我来说,格式化为在特定操作系统上运行的事实意味着需要一些解释让它运行.
这个问题对Stack Overflow来说太复杂了吗?
它们在“裸机”上运行,但是它们确实包含特定于操作系统的内容。可执行文件通常会向内核提供一些有关程序应如何加载到内存的指令(可以解释为“已解释”),并且文件的代码将提供其“挂钩”运行中的操作的方式。系统,例如通过操作系统的API或通过设备驱动程序。一旦将这种无法解释的程序加载到内存中,它就可以在裸机上运行,但会继续与也在裸机上运行的操作系统进行通信。
在单进程操作系统时代,可执行文件本质上是“夺取”整个计算机的控制权并直接与硬件进行通信,这很普遍。诸如Apple []和Commodore 64之类的计算机就是这样工作的。在Windows或Linux之类的现代多任务操作系统中,应用程序和操作系统通过复杂的多任务安排共享CPU的使用,并且应用程序通过内置在操作系统API及其设备驱动程序中的一组抽象来访问硬件。如果您有兴趣学习很多细节,请参加操作系统设计课程。
跳开Junaid的答案,内核阻止程序执行“有趣”操作的方式是控制内存的分配和使用。内核要求通过内存通过其API请求和访问内存,从而保护计算机免受“未经授权”的访问。在单进程操作系统的时代,应用程序具有更大的自由来直接访问内存和其他内容,而无需使用操作系统。在旧的Apple []上运行的应用程序可以读取或写入其想要在整台计算机上的RAM中的任何地址。
编译后的应用程序不能仅在另一个操作系统上“运行”的原因之一是,这些“挂钩”对于不同的操作系统是不同的。例如,知道如何从Windows请求内存分配的应用程序可能不知道如何从Linux或Mac OS请求内存分配。正如Disk Crasher所述,这些低级访问指令是由编译器插入的。