《30天自制操作系统》Day00

发布时间 2023-06-22 15:19:40作者: 林序

一、如何开发操作系统
  电脑开机后,操作系统的加载过程主要分为BIOS自检、MBR引导和操作系统加载三个阶段,这之后,操作系统就被加载到了计算机的内存中。首先是BIOS自检。当计算机上电后,主板上的基本输入输出系统(BIOS)会进行自检(POST),检查硬件是否正常运行。在检测完成后,BIOS会按照预设的启动设备顺序依次寻找可引导设备,例如硬盘、光驱、USB等。接着是MBR引导。一旦BIOS找到了可引导设备,它会读取该设备的第一个扇区中的主引导记录(MBR),其中包含了引导程序和分区表信息。引导程序(Boot Loader)根据分区表找到系统分区,并进一步加载操作系统的引导程序。最后是操作系统加载。操作系统的引导程序会从系统分区中读取操作系统核心文件到内存,并开始按照预定的启动流程进行初始化。操作系统初始化的过程包括完成硬件设备的识别、初始化,创建管理系统资源的进程,并最终启动各种服务、驱动程序、应用程序等。当操作系统加载完成后,计算机的所有硬件设备都得到了正确的配置,用户可以开始进行各种操作和任务。

 

  映像文件(Image file)是计算机中一种特殊的文件,它是对文件系统、应用程序或整个磁盘的一系列数据进行完全复制和备份的文件。与普通的文件不同,映像文件可以包含完整的文件系统结构、数据、元数据、权限、用户等信息,因此可以方便地进行重建、恢复或迁移操作。在计算机领域中,常见的映像文件格式有ISO、Nero等。ISO格式的映像文件通常用于光盘、DVD或蓝光光盘的备份和镜像,Nero格式的映像文件则适用于卡带、U盘或其他外部存储设备的备份和镜像。映像文件通常用于系统备份、系统还原、软件安装、硬件克隆等场景。比如,在重装系统时,可以使用系统备份的映像文件来恢复系统到之前的状态,这样可以节省安装软件的时间,提高效率。同时,映像文件也经常被作为虚拟机系统的源文件使用,虚拟化技术的兴起使得映像文件的使用越来越广泛。
  操作系统映像(Operating System Image)是指一个包含完整操作系统安装文件的映像,通常包括了操作系统本身、所需的驱动程序以及其他必要的组件和文件。操作系统映像文件可以用于操作系统的快速部署和自动化安装,也可作为备份和还原操作系统的一种方式。在使用操作系统映像文件时,常见的做法是先将映像文件写入到安装介质(如U盘或光盘)中,然后通过设置BIOS启动顺序,从安装介质中启动计算机。此时,操作系统安装程序会自动检测和加载映像文件,并根据映像文件中的配置信息自动进行操作系统的安装过程。使用操作系统映像来进行操作系统安装的好处在于可以快速且大规模地部署和安装操作系统,同时还可以避免由于人工操作造成的错误和漏洞。此外,在进行操作系统还原时,只需要使用备份的操作系统映像文件即可快速恢复操作系统到之前的状态,这对于系统维护和故障排除非常有帮助。

  BIOS(Basic Input/Output System)是计算机系统中最底层的软件,它位于计算机主板上一个存储芯片中,负责初始化和检测计算机硬件,并提供基本的输入输出服务【在操作系统加载之前,BIOS会将用户的键盘输入、鼠标移动等事件捕获并传递到系统。同时,BIOS会将系统输出显式到计算机的显示器上。】。
  在计算机启动时,BIOS首先会对各种硬件部件进行自检,也称为POST(Power-On Self Test)。在计算机启动时,BIOS会通过自检程序来检测硬件是否工作正常,如果有问题,BIOS会发出错误提示音或显示错误信息。如果POST通过了全部的测试,那么BIOS就会将控制权交给操作系统。同时,BIOS还可以设置一些系统参数,例如系统时钟、启动顺序、硬盘接口配置、内存调整、电源管理、显示器参数等。这些参数可以根据用户的需求进行修改,以满足不同的使用场景和需求。BIOS还支持一些外部设备,例如USB驱动器、PCI扩展卡等,这些设备需要经过BIOS的初始化和检测才能够正常工作。同时,BIOS还可以设置一些安全性相关的设置,例如禁止启动外部设备、设置启动密码等。
  需要注意的是,由于BIOS是直接执行在硬件上的软件,因此它就像一个固件,不能随意升级和修改。如果用户不清楚自己的操作,可能会造成计算机无法启动或出现其他问题。因此,在修改BIOS设置或升级BIOS时需要谨慎操作,并根据主板厂商的建议执行操作。
  由于BIOS经常需要进行硬件初始化和自检等操作,所以会导致计算机启动速度较慢。此外,在传统BIOS中,由于写入系统文件的限制以及空间和时间的限制,扩展和更新BIOS十分困难,而且存在诸多兼容性问题和漏洞。因此,现代计算机大多采用了UEFI(Unified Extensible Firmware Interface)作为替代方案。
  UEFI(Unified Extensible Firmware Interface)是一种新型的固件接口标准,它取代了传统BIOS成为了计算机启动和硬件初始化的重要组成部分。与传统BIOS相比,UEFI具有更快的启动速度、更强的扩展性和更高级的安全特性。UEFI最早于2005年推出,成为了替代传统BIOS的方案,它是由各大计算机厂商、操作系统厂商以及固件厂商共同制定的一种开放标准。UEFI基于C语言和C++语言编写,并提供了一个模块化的架构,使得它能够更好地支持新的硬件设备和操作系统,并且可以通过升级固件来更新功能。相较于传统BIOS,UEFI有以下几个优点:UEFI启动的速度比传统BIOS快得多,这是因为UEFI能够更直接地从硬盘或其他存储介质中加载操作系统,而无需进行复杂的初始化和检测操作。UEFI具有更强的扩展性,UEFI采用了模块化的架构,可以支持新的硬件设备和操作系统平台,并且可以通过升级固件来添加新的特性和功能。UEFI提供了更高级的安全特性,例如启动密码、UEFI Secure Boot等,这些特性可以有效地防止恶意软件和操作系统的入侵,并保护用户的计算机数据安全。需要注意的是,由于UEFI是一种新型的固件接口标准,它需要新型的硬件支持才能够正常工作。因此,如果您要升级到UEFI固件,需要确认您的计算机硬件是否支持UEFI,并按照制造商的指导进行相应的操作。

  如果C编译器和映像文件制作工具等不一样的话,开发过程中就会产生一些细微的差别。所以直接使用作者提供的工具。

二、操作系统开发中的困难
  本书使用C作为开发语言。市面上众多的C编译器都是为了进行应用程序的开发而设计的,几乎没有为了开发操作系统而设计的专门的C编译器。本书作者提供的编译器,也是以Windows版的gcc为基础稍加修改而做成的,与gcc几乎没什么不同。GCC(GNU Compiler Collection)是一种自由软件,也是一个编译器系统,它由一系列的编译器组成,用于编译各种计算机程序语言,包括C、C++、Fortran、Ada、Objective-C等。GCC是跨平台的编译器,不仅在Linux和Unix系统中广泛使用,而且被移植到了许多其他操作系统平台中,包括Microsoft Windows、macOS、Android等。

  由于依靠开发应用程序用的C编译器来写操作系统,实际过程中会有很多不方便的地方。因为C中很多函数都是以操作系统提供的功能为前提编写的,在我们自己开发操作系统时,什么功能也没有,所以C中的大部分函数都无法使用。当然了,C语言是比较少依赖操作系统功能的语言,不用函数也可以完成大部分的代码。如果是其他的C++、Java、Python等语言,依赖操作系统功能的情况会更加严重,这也就是为什么作者选用C进行开发的原因之一。另外,在开发操作系统时,需要用到CPU中的寄存器,但是由于C编译器是用于开发应用程序的,并没有操作寄存器的命令,所以有部分代码需要使用汇编语言来编写。我们需要知道使用的C编译器是如何把程序编译成机器语言的,以便编写的汇编语言代码能够和C编译器保持一致,这样汇编语言编写的部分和C语言编写的部分才能够顺利衔接起来。总之,如果不理解自己所使用的语言是如何进行编译的,就没法用这种语言来编写操作系统。

  编写应用程序所用的语言,与开发操作系统所使用的语言是没有任何关系的。我们在开发完成的操作系统上可以使用任何开发语言来开发想要的应用程序。