因此,根据我的理解,有两种类型的程序,即解释的程序和编译的程序。解释程序由解释器执行,解释器是其所在平台的本机应用程序,编译程序本身就是它们所在平台的本机应用程序(或系统软件)。
但我的问题是:除了内核实际上是由CPU直接运行的吗? Windows可执行文件是“Windows可执行文件”,而不是x86或amd64可执行文件。这是否意味着内核所有的其他进程实际上都被内核解释,就像浏览器解释Javascript一样?或者是内核将这些进程放在内核所在的“裸机”上?
如果他们使用的是“裸机”,那么Windows是如何知道程序是Windows程序而不是Linux程序的,因为它们都是为amd64处理器编译的?如果是因为可执行文件的“格式”,那么该可执行文件如何能够在“裸机”上运行,因为对我来说,格式化为在特定操作系统上运行的事实意味着需要一些解释让它运行。
Stack Overflow这个问题是否过于复杂?
答案 0 :(得分:4)
它们运行在"裸机",但它们确实包含特定于操作系统的东西。一个可执行文件通常会向内核提供一些指令(可以说是#34;解释")关于如何将程序加载到内存中,文件的代码将为它提供方法to" hook"进入正在运行的操作系统,例如通过操作系统的API或通过设备驱动程序。一旦将这样的非解释程序加载到内存中,它就会在裸机上运行,但会继续与操作系统通信,而操作系统也在裸机上运行。
在单进程操作系统的时代,可执行文件通常基本上可以抓住"控制整个计算机并直接与硬件通信。像Apple这样的计算机[和Commodore 64这样的工作。在像Windows或Linux这样的现代多任务操作系统中,应用程序和操作系统通过复杂的多任务安排共享CPU的使用,并且应用程序通过操作系统API及其内置的一组抽象来访问硬件。设备驱动程序。如果您有兴趣学习很多细节,请参加操作系统设计课程。
弹出Junaid的答案,内核阻止程序做某事的方式"搞笑"是通过控制内存的分配和使用。内核要求通过其API通过它来请求和访问内存,从而保护计算机免受未授权的"访问。在单进程操作系统的时代,应用程序可以更自由地直接访问内存和其他内容,而不涉及操作系统。运行在旧Apple上的应用程序[可以读取或写入RAM中要在整个计算机上的任何地址。
编译后的应用程序不会只运行"在另一个操作系统上,这些"挂钩"对于不同的操作系统是不同的。例如,知道如何从Windows请求分配RAM的应用程序可能不知道如何从Linux或Mac OS请求它。正如Disk Crasher所提到的,编译器会插入这些低级访问指令。
答案 1 :(得分:2)
我觉得你很困惑。编译的程序是机器可读格式。当您运行程序时,内核将分配内存,CPU等,并确保程序不会干扰其他程序。如果程序需要访问硬件资源或磁盘等,内核将处理它,因此内核将始终位于硬件和您在用户空间中运行的任何软件之间。
如果程序被解释,那么该语言的相关解释器会将代码转换为机器可读的内容,内核仍将提供相同的功能,如访问硬件并确保程序没有做任何有趣的事情,如尝试访问其他程序存储器等。
答案 2 :(得分:1)
唯一运行在“裸机”上的是assembly language代码,它是由OS和编译器中的许多层从程序员中抽象出来的。一般而言,应用程序被编译为OS和CPU架构。它们不会在其他操作系统上运行,至少在没有适当的框架的情况下(例如Linux上的Mono)。
当天早些时候,很多代码都是使用macro assemblers在裸机上编写的,但这在今天的PC上几乎闻所未闻。 (甚至在宏汇编程序之前还有一段时间。)