作为开发人员,从头开始构建操作系统是最具挑战性和最有价值的经历之一。与高级应用程序开发不同,在高级应用程序开发中,几乎所有内容都有一个库,操作系统开发迫使您近距离工作,直接接触硬件,手动管理内存,并控制机器运行方式的各个方面。
根据我的经验,构建操作系统意味着深入了解汇编语言,与硬件搏斗,并努力应对崩溃、重新启动(特别是重新启动)和长时间的调试会话。如果您认为调试引导加载程序很困难,请尝试在没有现代工具的情况下进行调试。操作系统的开发让你多次质疑自己的人生选择。
也就是说,让我们将其全部分解,从引导加载程序到功能齐全的桌面环境,您可以在其中移动鼠标并打开文本编辑器进行输入。
引导加载程序是任何操作系统开发之旅的第一步。当您的计算机打开时,BIOS 接管并检查您的硬件,然后将引导加载程序从磁盘加载到内存中。这个小程序的工作是让 CPU 做好准备并将操作系统的内核加载到内存中。您必须用汇编语言编写引导加载程序,因为在此阶段您直接处理硬件。
当引导加载程序启动时,CPU 处于16 位实模式,这意味着它只能寻址 1MB 内存。您需要做的第一件事是从磁盘加载内核并将其移动到内存。之后,引导加载程序将 CPU 切换到 32 位保护模式,这就是乐趣开始的地方。切换模式需要设置全局描述符表(GDT)来管理内存段并启用CPU控制寄存器中的保护启用(PE)位。如果你犯了这个错误,系统要么冻结,要么崩溃进入启动循环,这种情况在我身上发生的次数比我愿意承认的要多。
在实模式中,一切都是超级有限的——16位寄存器,1MB内存访问,没有内存保护。这就是为什么切换到保护模式如此重要。一旦进入保护模式,您的 CPU 就可以访问 32 位寄存器、更大的内存寻址以及多任务处理和分页(虚拟内存)等高级功能。引导加载程序就是为了让这种转变无缝发生。
一旦 CPU 切换到保护模式,引导加载程序就会将控制权交给内核。内核是操作系统的核心,负责管理一切:硬件、内存、进程和系统资源。
内核启动时,必须设置几个关键系统:
构建内核是一项漫长而复杂的任务,但它也是最有价值的任务之一。在这里您可以看到操作系统的内部工作原理并控制机器行为的每一个小细节。
构建操作系统时,您必须为每个任务选择正确的编程语言。 引导加载程序通常用程序集编写,因为您需要直接控制硬件。然而,一旦您处于保护模式并在内核上工作,大多数开发人员都会切换到 C,因为它为您提供低级控制,而无需在汇编中编写所有内容。
一些开发人员使用C 进行内核开发,因为它提供了面向对象的功能,可以使管理复杂系统变得更容易。然而,C 语言会带来额外的开销,并且 C 语言的内存管理在操作系统环境中可能会更加棘手。 C 为您提供系统编程所需的原始功能和简单性。
在操作系统开发中,安全至关重要。与高级编程不同,在高级编程中,崩溃可能仅意味着错误消息或应用程序关闭,而在操作系统开发中,崩溃通常意味着系统完全重新启动。您直接使用内存,这意味着如果您搞乱内存管理,则可能会损坏系统数据、覆盖重要结构或导致内核恐慌。
内核需要实现内存保护,以防止一个进程覆盖另一个进程的内存。这是通过使用分页来完成的,它将每个进程映射到自己的虚拟内存空间。如果你犯了这个错误,整个系统就会变得不稳定,你将需要花费数天的时间来寻找内存错误。相信我,我去过那里。
速度是让您的操作系统感觉响应迅速的关键因素。缓慢的内核意味着缓慢的系统,因此优化性能至关重要。以下是速度很重要的几个关键领域:
现在内核已经运行,是时候构建驱动程序来与硬件交互了。驱动程序是操作系统和硬件之间的桥梁,允许操作系统与键盘、显示器和磁盘驱动器等设备进行通信。
首先,您的操作系统可能会以文本模式启动,在该模式下,您将字符直接打印到视频内存(通常在地址 0xB8000)。这对于调试和基本输出来说很好,但最终,您会想要转向图形用户界面(GUI)。这需要一个视频驱动程序来管理像素级控制、屏幕分辨率和颜色深度。
设置视频驱动程序是创建图形操作系统的一大步,但它也是更复杂的任务之一,因为它涉及了解显示硬件的工作原理以及管理每帧的大量数据。
键盘驱动程序是交互式操作系统最重要的部分之一。当您按下某个键时,键盘会向 CPU 发送扫描码。键盘驱动程序的工作是将扫描代码转换为操作系统可以理解的字符或操作。这涉及为 IRQ1(键盘生成的硬件中断)设置中断处理程序。
一旦键盘驱动程序正常工作,您就可以开始构建更复杂的用户界面,获取用户的输入并处理命令。
I/O 驱动程序 使您的操作系统能够读取和写入磁盘。这对于加载程序、保存文件和存储数据等操作至关重要。起初,您可能会使用 BIOS 中断与磁盘交互,但随着操作系统的成熟,您会想要转向更多
不依赖BIOS的高级I/O方法,例如直接与磁盘控制器通信。
一旦你的基本驱动程序开始工作,就可以构建一个 shell – 让用户与操作系统交互的命令行界面 (CLI)。 shell 是用户可以键入命令、执行程序以及与文件系统交互的地方。
实现 shell 是令人兴奋的一步,因为它是您的操作系统真正开始感受到交互性的第一个地方。您需要处理用户输入(来自键盘)、处理命令并执行程序。这也是您开始看到内核高效执行多任务和管理进程的能力的重要性的地方。
文件系统 允许您的操作系统在磁盘上存储和检索数据。虽然您可以使用现有的文件系统(例如 FAT 或 ext4),但构建您自己的自定义文件系统可以为您提供更多控制权,并且可能是一个有趣的挑战。
基本文件系统应该:
随着操作系统的发展,您还需要处理更高级的功能,例如:
设计文件系统很棘手,因为它涉及平衡性能、可靠性和易用性。设计不当的文件系统可能会导致数据损坏、性能下降或浪费磁盘空间。
现在您的操作系统已经有了 CLI 并且可以处理键盘输入,是时候添加 鼠标支持了。鼠标驱动程序负责跟踪鼠标的移动并将其转换为屏幕上的操作,例如移动光标或单击按钮。
构建鼠标驱动程序涉及处理IRQ12、鼠标生成的硬件中断以及处理移动数据。一旦安装了鼠标驱动程序,您就可以开始考虑构建图形用户界面(GUI)。
图形用户界面 (GUI) 将您的操作系统从命令行界面转变为看起来和感觉更像现代桌面环境的界面。在此阶段,您需要构建用户可以用鼠标单击的窗口、按钮、菜单和其他交互元素。
创建 GUI 涉及管理图形渲染(绘制窗口和图标)、处理输入事件(点击、按键等),以及实现一个系统来管理多个窗口和应用程序。
首先,您的 GUI 可能非常基本——只有一个用户可以与之交互的窗口。但随着操作系统的成熟,您将需要添加更多高级功能,例如调整窗口大小、拖放功能和动画。
一旦掌握了 GUI 的基础知识,下一步就是构建一个用于管理窗口和事件的系统。这涉及一次处理多个窗口,每个窗口可能运行不同的应用程序,并确保每个窗口接收正确的输入事件(例如鼠标单击或键盘按下)。
您还需要实现窗口 z 排序(哪个窗口位于顶部)、最小化/最大化 和 拖动。这就是事情开始感觉更像传统桌面环境的地方。
为了使您的 GUI 更实用,您需要构建基本应用程序,例如 记事本 应用程序。记事本应用程序是一个简单的文本编辑器,允许用户键入、编辑和保存文件。构建这样的应用程序涉及:
这是将所有内容组合在一起的一个很好的练习:你的 GUI、你的文件系统和你的输入处理都在这里发挥作用。一旦你有了一个可以运行的记事本应用程序,你就拥有了一个功能齐全的操作系统的基础知识。
此时,您的操作系统已正常运行,但总有一些小细节让它感觉更加精致。诸如此类:
您添加的每一个小细节都会让您的操作系统更接近一个完整的系统。这是一个漫长而富有挑战性的过程,但到最后,您将创建出真正独特的东西 - 一个从头开始构建的操作系统。
以上是操作系统开发(真相)的详细内容。更多信息请关注PHP中文网其他相关文章!