[从 0 开始写一个操作系统] 二、系统软件启动过程

从 0 开始写一个操作系统

作者:解琛
时间:2020 年 8 月 30 日

二、系统软件启动过程

Linux 解压方式总结

操作系统是一个软件,也需要通过某种机制加载并运行它。

在这里我们将通过另外一个更加简单的软件 bootloader 来完成这些工作。

我们需要完成一个能够切换到x86的保护模式并显示字符的 bootloader,为启动操作系统 ucore 做准备。

bootloader 执行代码小于 512 个字节,这样才能放到硬盘的主引导扇区中。

安装 virtualbox 虚拟机。

sudo apt install virtualbox

下载实验镜像 mooc-os-2015.vdi.xz ,对镜像进行解压,解压之后的文件是 6G 左右,所以解压时间比较久,需要耐心等待。

sudo apt install xz-utils
unxz mooc-os-2015.vdi.xz

在 VirtualBox 中创建新虚拟机(设置 64 位 Linux 系统,指定配置刚解压的这个虚拟硬盘 mooc-os-2015.vdi),就可以启动并运行已经配置好相关工具的 Linux 实验环境了。

新建虚拟机

如果没有 64 位的选项,那就重启一下电脑时进入 DOS 配置,把 硬件虚拟化 开启即可。

系统的密码是一个空格:

ubuntu 的使用方法可以参考我写的一篇文章:MX Linux

2.1 BIOS 启动过程

当计算机加电后,一般不直接执行操作系统,而是执行系统初始化软件完成基本 IO 初始化和引导加载功能。

简单地说,系统初始化软件就是在操作系统内核运行之前运行的一段小软件。

通过这段小软件,我们可以初始化硬件设备、建立系统的内存空间映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

最终引导加载程序把操作系统内核映像加载到RAM中,并将系统控制权传递给它。

对于绝大多数计算机系统而言,操作系统和应用软件是存放在磁盘(硬盘/软盘)、光盘、EPROM、ROM、Flash 等可在掉电后继续保存数据的存储介质上。

计算机启动后,CPU 一开始会到一个特定的地址开始执行指令,这个特定的地址存放了系统初始化软件,负责完成计算机基本的 IO 初始化,这是系统加电后运行的第一段软件代码。

对于 Intel 80386 的体系结构而言,PC 机中的系统初始化软件由 BIOS (Basic Input Output System,即基本输入/输出系统来完成。

其本质是一个固化在主板 Flash/CMOS 上的软件)和位于软盘/硬盘引导扇区中的 OS Boot Loader(在 ucore 中的 bootasm.S 和 bootmain.c )一起组成。

BIOS 实际上是被固化在计算机 ROM(只读存储器)芯片上的一个特殊的软件,为上层软件提供最底层的、最直接的硬件控制与支持。

更形象地说,BIOS 就是 PC 计算机硬件与上层软件程序之间的一个"桥梁",负责访问和控制硬件。

以 Intel 80386 为例,计算机加电后,CPU 从物理地址 0xFFFFFFF0(由初始化的 CS:EIP 确定,此时 CS 和 IP 的值分别是 0xF000 和 0xFFF0 ))开始执行。

在 0xFFFFFFF0 这里只是存放了一条跳转指令,通过跳转指令跳到 BIOS 例行程序起始点。

BIOS 做完计算机硬件自检和初始化后,会选择一个启动设备(例如软盘、硬盘、光盘等),并且读取该设备的第一扇区(即主引导扇区或启动扇区)到内存一个特定的地址 0x7c00 处,然后 CPU 控制权会转移到那个地址继续执行。

至此 BIOS 的初始化工作做完了,进一步的工作交给了 ucore 的 bootloader。

安装一下 i3 + vimplus + ranger,用来看代码和浏览文件,虚拟机上提供了很多 IDE 工具,可以自由选择。

sudo apt update
sudo apt install ranger
sudo apt install i3
git clone https://github.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh

具体的使用方法可以参考我写的 3 篇文章:ranger vimplus vim 进阶配置 i3wm

2.2 bootloader 启动过程

BIOS 将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行 bootloader。

bootloader 完成的工作包括:

  • 切换到保护模式,启用分段机制;
  • 读磁盘中 ELF 执行文件格式的 ucore 操作系统到内存;
  • 显示字符串信息;
  • 把控制权交给 ucore 操作系统。

2.2.1 保护模式和分段机制

Intel 80386 只有在进入保护模式后,才能充分发挥其强大的功能,提供更好的保护机制和更大的寻址空间,否则仅仅是一个快速的 8086 而已。

没有一定的保护机制,任何一个应用软件都可以任意访问所有的计算机资源,这样也就无从谈起操作系统设计了。

Intel 80386 的分段机制一直存在,无法屏蔽或避免。

在我们的 bootloader 设计中,涉及到了从实模式到保护模式的处理,我们的操作系统功能(比如分页机制)是建立在 Intel 80386 的保护模式上来设计的。

2.2.1.1 实模式

在 bootloader 接手 BIOS 的工作后,当前的 PC 系统处于实模式(16位模式)运行状态

在这种状态下软件可访问的物理内存空间不能超过 1MB,且无法发挥 Intel 80386 以上级别的 32 位 CPU 的 4GB 内存管理能力。

实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。

这样用户程序的一个指针如果指向了操作系统区域或其他用户程序区域,并修改了内容,那么其后果就很可能是灾难性的。

通过修改 A20 地址线可以完成从实模式到保护模式的转换。

2.2.1.2 保护模式

只有在保护模式下,80386 的全部 32 根地址线有效,可寻址高达 4G 字节的线性地址空间和物理地址空间,可访问 64TB(有 2 1 4 2^14 214 个段,每个段最大空间为 2 3 2 2^32 232 字节)的逻辑地址空间,可采用分段存储管理机制和分页存储管理机制。

这不仅为存储共享和保护提供了硬件支持,而且为实现虚拟存储提供了硬件支持。

通过提供 4 个特权级和完善的特权检查机制,既能实现资源共享又能保证代码数据的安全及任务的隔离。

保护模式下,有两个段表:GDT(Global Descriptor Table)和 LDT(Local Descriptor Table)。

每一张段表可以包含 8192 ( 2 1 3 2^13 213 )个描述符,因而最多可以同时存在 2 ∗ 2 1 3 = 2 1 4 2 * 2^13 = 2^14 22

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

解琛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值