我现在真的很好奇。我是一名 Python 程序员,这个问题让我感到困惑:你编写了一个操作系统。你如何运行它?它必须以某种方式运行,并且这种方式是在另一个操作系统中?
一个应用程序如何在没有操作系统的情况下运行?如果计算机没有要运行的操作系统,你如何告诉计算机运行,比如 C,并在屏幕上执行这些命令?
它与 UNIX 内核有关吗?如果是这样,什么是unix 内核,或者一般来说是内核?
我确信操作系统比这更复杂,但它是如何工作的?知道这一点真是太棒了!
谢谢。
我现在真的很好奇。我是一名 Python 程序员,这个问题让我感到困惑:你编写了一个操作系统。你如何运行它?它必须以某种方式运行,并且这种方式是在另一个操作系统中?
一个应用程序如何在没有操作系统的情况下运行?如果计算机没有要运行的操作系统,你如何告诉计算机运行,比如 C,并在屏幕上执行这些命令?
它与 UNIX 内核有关吗?如果是这样,什么是unix 内核,或者一般来说是内核?
我确信操作系统比这更复杂,但它是如何工作的?知道这一点真是太棒了!
谢谢。
您确实可以编写没有操作系统的程序。实际上,在您的操作系统启动之前,您的 PC 上已经有一个无需操作系统即可运行的程序。事实上有两个。首先是您的 BIOS。
IBM PC 体系结构是使用 BIOS 来启动计算机的一系列体系结构之一。并非所有架构都有 BIOS。例如,iPhone 直接引导到引导加载程序。事实上,大多数“现代”架构没有 BIOS,而是直接启动到引导加载程序。这种方式实际上在概念上更简单。
PC 需要 BIOS 的事实只是历史遗留问题。最初的 IBM BIOS 实际上是用于加载 DOS 的基本引导加载程序。现代 BIOS 仍然是引导加载程序……加载引导加载程序。
大多数 PC BIOS 都是专有的。它们允许制造商在将控制权传递给引导加载程序之前初始化自定义/专有硬件。这使得编写引导加载程序成为可能,而不必担心操作系统映像在闪存驱动器、USB 拇指驱动器、SD 卡、磁盘、DVD 等上的天气。引导加载程序只看到一个已初始化的磁盘BIOS。
启动的下一阶段是引导加载程序。IBM PC 架构需要引导加载程序的原因是 BIOS 通常设计用于设置 CPU 以运行 DOS。现代操作系统要求 CPU 的配置略有不同。此外,现代操作系统内核(内核是操作系统的实际核心可执行代码,用于管理内存、cpu 等)往往是大型野兽,通常大于 4MB,这比大多数 BIOS 设计加载的大小要大得多. 因此 BIOS 会加载一个小型引导加载程序,该引导加载程序又会加载实际的操作系统。同样,这只是因为 IBM 在 1980 年代设计原始 PC 架构时做出的决定。iPhone 或 PS3 等现代架构不这样做。它们直接引导到引导加载程序。
引导加载程序是解决鸡与蛋问题所必需的:加载您需要从磁盘读取的操作系统。要从磁盘读取,您需要使用操作系统加载的设备驱动程序。为了打破这种循环依赖,人们编写引导加载程序,它们基本上是非常简单的操作系统,旨在仅运行一个程序(操作系统)并了解如何从磁盘(或 SD 卡或网络等)读取。
这将我们带到回答您问题的部分。如果你写了一个操作系统,你如何加载它?您可以通过配置引导加载程序来加载它。Windows 带有一个不太灵活的引导加载程序。它了解如何加载 Windows,仅此而已。您可以安装像Grub或Burg这样的开源引导加载程序,它们也了解如何加载其他操作系统。
引导机器所涉及的基本概念实际上很简单。可怕的是细节。但是,如果您真的对操作系统的工作原理感兴趣,学习它最终会非常有益。另外,如果你对这些东西感兴趣,我建议你看看除了 IBM PC 之外的其他架构,比如 Mac 硬件,它使用 EFI 而不是传统的 BIOS 或 Linksys 路由器,它们直接从引导加载程序或嵌入式平台启动到 Linux,比如运行单个程序的 Arduino,您无需操作系统即可直接在 CPU 上编译。
运行任何软件的是某种 CPU、一段电子电路、硬件。
无论软件是操作系统还是其他类型的程序,CPU 都不在乎。它只是尽可能长时间地运行它(例如,直到所述软件导致不可恢复的错误迫使 CPU 进入一些奇怪的状态或简单地复位)。
开机后,CPU 开始执行它在内存中某个位置找到的任何代码。该位置可以硬连线在 CPU 中,也可以由 CPU 电路外部配置,甚至可以由软件编程。它是哪一个取决于 CPU 以及整个设备的设计方式。
并非所有程序都需要操作系统才能在 CPU 上运行。操作系统就是这种程序的一个很好的例子。如果每个操作系统都需要另一个操作系统,你将如何停止这种无限递归?:) 但它不是唯一的。
许多电子设备,尤其是像数字时钟这样非常简单的电子设备,没有任何操作系统。
一个操作系统在另一个操作系统上运行的唯一时间是当你有虚拟化时。但我不会在这个答案中去那里。
操作系统只需要它的基本功能,如调度、线程/进程同步、内存分配等,或者自己完成所有或大部分设备 I/O 并隐藏操作系统中运行的程序 IOW 的硬件特性,以允许便携式程序。你用print 123
Python 编写,它会在任何与 Python 兼容的操作系统(=它可用)中到处打印 123,而不管显示器、分辨率以及在不同计算机和不同操作系统中可能存在的许多其他差异。如果通用操作系统没有提供一些通用功能(以及一些或多或少通用的 API),例如控制台和文件 I/O 和内存管理,那么 Python 就不会为它们提供,这些操作系统也不会通用——首先是目的。
操作系统内核是操作系统的核心。它完成了大部分低级和肮脏的工作,处理:
有时操作系统功能就足够了,在这种情况下,操作系统和内核之间没有任何区别,它们在这里是一样的。
如果,OTOH,需要更多的东西,例如更大的灵活性,对不同设备的支持,一些管理所有这些的代码和一堆用于文件系统的特殊驱动程序,用于网络和 TCP/IP 堆栈等,那么一个简单的(也许,只有相对简单的)内核本身是不够的,它周围需要更多的东西,这就是你开始区分操作系统和内核并到达操作系统 = 内核 + 附加功能的地方。您正在使用的文本编辑器,即使它与您的操作系统一起提供,也不完全是这些附加功能之一,它是一个常规程序,不需要与操作系统捆绑,但为了方便起见,它可以是。
UNIX 是操作系统的一个示例。还有更多,最著名的是 Linux 和 Windows。
你应该给自己买一本关于计算机体系结构和组织的书,以了解计算机一般是如何工作的。它里面是什么,它是如何组合在一起的,引擎盖下发生了什么,等等。
你需要一个操作系统来做一些事情,比如虚拟化内存和仲裁对硬件的访问。因为操作系统可以完全访问内存和硬件之类的东西,所以它不需要操作系统来运行。大多数程序从操作系统获得的服务,操作系统本身要么必须自己提供,要么必须从硬件获得。