一、概述
本系列的目的是使用 C 和 x86 汇编语言从头开始学习操作系统 (OS) 开发,典型特点是:“增量”学习。
实践参考:
http://www.brokenthorn.com/Resources/OSDevIndex.html
注:在开始对系统进行编程时,您会发现根本没有任何东西可以帮助您。上电时,系统也以 16 位实模式运行,32 位编译器不支持该模式。这是第一件重要的事情:如果你想创建一个16位实模式操作系统,你必须使用16位C编译器。但是,如果您决定创建 32 位操作系统,则必须使用 32 位 C 编译器。 16 位 C 代码与 32 位 C 代码不兼容。
二、OS基础知识
1. 整体上操作系统向下管理硬件,向上为用户/应用提供服务,总体上功能分为:
(1)CPU管理:主要是程序的执行,如中断、进程、调度算法等。
(2)内存管理:主要对ROM、RAM等的管理,包括分配内存、释放内存、内存保护。
(3)设备管理:即IO设备,包括FLASH, 硬盘、USB、鼠标、键盘、显示器等读写。
(4)文件系统:主要是对数据存储管理,包括读写操作。
(5)UI界面: 包括shell命令行和图形化操作界面。
(6)信息安全: 授权访问管理,如用户、角色权限访问管理。
2. 操作系统启动过程
操作系统的启动过程是一个复杂且关键的步骤,它涉及到硬件、固件(BIOS/UEFI)、引导程序(Bootloader)以及操作系统本身的多个阶段。以下是一个简化的概述,描述了从计算机开机到操作系统完全加载的典型过程:
(1)上电与自检(Power-On Self-Test, POST):当计算机接通电源后,首先进行的是上电自检(POST)。这是由计算机的固件(BIOS或UEFI)执行的一系列检查,用于确保硬件设备(如CPU、内存、硬盘、外设等)正常工作。如果POST检测到任何问题,计算机可能会发出声音或显示错误信息。
(2)固件初始化:固件(BIOS或UEFI)初始化后,会寻找可启动的设备。这通常是通过在硬盘、SSD、光盘驱动器、USB设备等中查找引导扇区来完成的。固件会按照预设的启动顺序检查这些设备。
(3)引导加载程序(Bootloader):一旦固件找到了可启动的设备,它会读取该设备的第一个扇区(引导扇区),这个扇区通常包含一个小型的引导加载程序。这个程序的任务是加载更复杂的引导管理程序或直接加载操作系统。
(4) 加载操作系统内核:引导加载程序接下来会加载操作系统的内核到内存中。这通常涉及到从硬盘或其他存储介质读取内核文件,并将其复制到内存中适当的位置。
(5)内核初始化:内核被加载到内存后,控制权被交给内核。内核初始化各种驱动程序,设置中断处理程序,初始化系统服务和进程调度器等。这一步骤是操作系统启动过程中最关键的部分。
(6)系统服务和守护进程:内核初始化完成后,它会启动系统服务和守护进程,如网络服务、日志系统等。
(7)用户界面:操作系统会加载用户界面。对于图形界面(如Windows、macOS或Linux的桌面环境