我很好奇操作系统是如何工作的,我有一个问题。当操作系统文件加载到 RAM 时,该文件是机器代码,对吗?它可以在没有编译器或汇编器的情况下执行吗?
(这就是为什么我问这个问题的时候,我们开发用高级语言编写的操作系统,所以它需要编译,但是保存在硬盘或 SSD 中的操作系统文件怎么办?我认为它之前已经编译过,所以它将是存储在内存中的机器代码。)
谢谢(抱歉我的英语不好)
答案1
操作系统的“基础”(引导加载程序、内核)必须编译为机器代码,因为它需要处理各种特定于 CPU 架构的位,并且因为此时除了机器代码之外没有任何其他的预先存在的字节码解释器。
通常,出于各种原因,驱动程序和服务之类的东西也会被编译为机器代码。例如,在 Windows 或 Linux 上,大多数驱动程序都加载到内核中,因此必须将它们编译为机器代码;系统提供的库 (.dll) 被加载到各种随机进程中,因此它们也不能依赖于预先存在的运行时。(效率是另一个原因。)
另一方面,服务在自己的进程中运行的服务可以依赖运行时或解释器。例如,如果 Windows 想要使用 C# 编写并在 .NET CLR 上运行某些服务,它可以这样做(尽管我相信这是出于效率原因而故意避免的)。例如,Android“操作系统”的大部分都是用 Java/Kotlin 编写的。
答案2
所有文件都以二进制形式存储,我猜这就是所谓的机器代码。某些二进制模式(文件格式)像文本一样普遍存在,但这是由于操作系统和支持库/二进制文件。开发人员如何用二进制表示数据取决于他们。有关文件格式的更多信息,请参阅 wiki。
https://en.wikipedia.org/wiki/File_format
可执行文件只是在二进制数据的格式上有所不同。这取决于操作系统。如果我没记错的话,Linux 的机器代码是 ELF 格式。我绝对不记得 Windows/Mac 了。以下是有关可执行格式以及开发人员或他们的工具如何构造二进制文件的快速 wiki 搜索。
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
当您以编程方式读取文件时,您会将二进制负载(通常不是一次全部加载)加载到内存中,然后它是另一个您可以随意执行的变量。
答案3
硬盘上的文件包含任意二进制数据。
其中只有一些包含可执行代码。
文件系统并不关心文件中有什么,除非您要求操作系统打开该文件,否则操作系统也不会关心。
硬盘上只有一小部分文件实际上可执行。
JPG、PNG、DOC、DOCX、HTML 和大多数其他文件不包含可执行数据。
一般来说,最常见的类型是EXE文件,有些COM文件是直接可执行的。
某些语言(例如 PHP 或 python)会被中断并且不会被编译,因此每次都必须重新评估代码。
如果您使用 C 或其他语言编写程序,并且使用实际的编译器,则会产生可独立执行的可执行文件。
此代码可以在没有编译器或中断器的情况下执行,但 JPG 或其他文件无法执行。