你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:
- 了解大厂经验
- 拥有和大厂相匹配的技术等
希望看什么,评论或者私信告诉我!
一、背景
其实也没有啥背景。
最主要的原因就像 《30天自制操作系统》一书作者说的那样,写一个操作系统,仅仅想想就是一件特别有趣的事情呢。一两年前曾经入手开始写过,但慢慢的就不了了之了。现在又有这个想法了,准备一直干下去,最终写一个操作系统出来,算是程序员生涯的一份礼物。
其次的原因,是因为我也认为未来初级程序员的岗位会越来越少,借助 LLM 人人都是初级程序员可能会变成现实。这个时候专业性和底层就会越来越重要
二、 0x7c00
在 从零开发操作系统-第二天汇编语言、BIOS以及Makefile介绍 这篇文章中,我们提到了 0x7c00 这个地址中说了,这是IMB大叔们规定的。但我依然有很多问题,因为CPU要想从这个执行,PC寄存器必须设置为 0x7c00 才可以,但我们上篇文章从未设置过 PC,满满的大问号,这也带来了一系列的问题。
要想解决,就不得不从点击开机键说起。当我们点击电脑开机键的时候
在计算机启动过程中,CPU 和 BIOS 的启动顺序是这样的:
-
电源启动:
- 当你按下电源按钮时,电源供应器开始向主板和 CPU 提供电压。这个电源的引入触发了CPU的硬件复位(reset)。
-
CPU 初始化:
CPU 在接收到电源后会自动初始化。这个初始化过程是硬件级别的,由 CPU 内部的电路和微代码控制。CPU 会重置其内部状态,它会自动将内部状态重置到一个预定义的初始状态,包括寄存器和指令指针。例如:将程序计数器(PC)设置到一个特定的启动地址。
在x86架构中,这个启动地址被硬编码为0xFFFFFFF0(对于现代处理器)或0xFFFF0(对于旧的16位x86系统)。这个地址是设计时就确定的,是由硬件电路和微处理器设计决定的,这个初始地址是CPU的一个硬编码的启动向量,用于确保在系统启动时能够找到并执行BIOS(或UEFI)固件。
在早期的 x86 系统中,物理内存地址空间是 1MB(0x100000),而 BIOS 通常被映射在这个地址空间的高端,以避免与操作系统使用的内存冲突。
-
BIOS 执行:
- CPU 初始化完成后,会从预设的固定内存地址(通常是物理地址 0xFFFFFFF0 或 0xFFFF0)开始执行代码。这个地址在 x86 架构中是 BIOS 的 ROM 或 Flash 存储器的映射地址
- 这种映射地址是通过地址解码逻辑和内存映射硬件实现的,这些硬件在主板设计时就已经确定
- BIOS 存储在主板上的非易失性存储器中,它包含了一系列的指令和程序,用于在系统启动时进行硬件检测和初始化。
-
BIOS 检测硬件:
- BIOS 开始执行后,会进行一系列的硬件检测,包括检测 CPU 类型、内存大小、硬盘、显卡等。
- BIOS 会根据检测到的硬件配置来初始化硬件设备,并设置相应的配置参数。
-
引导过程:
- 在硬件检测和初始化完成后,BIOS 会查找可引导设备(如硬盘、软盘、USB驱动器等)。
- BIOS 从可引导设备的第一个扇区(通常是512字节)读取数据,并将其加载到内存中的0x7C00地址。
-
跳转到引导扇区:
- BIOS 会设置一个新的 CS:IP 组合,通常是将 CS 设置为 0xF000,IP 设置为 0xFFF0。这样,CS:IP 的实际值就是 0xF000:FFF0,转换为物理地址是 0xFFFFFFF0。
- 引导扇区的前几个字节通常包含一个跳转指令(如 JMP 0x7C00),这个指令会将 CPU 的 CS:IP 跳转到 0x7C00 地址。
- 在 x86 架构的 CPU 中,并没有一个名为 "PC" 的寄存器。在 x86 架构中,程序计数器(Program Counter)的功能是由 CS(代码段寄存器)和 IP(指令指针寄存器)共同实现的。这种设计是由于 x86 架构使用了分段内存模型。
-
执行引导扇区代码:
- 从 0x7C00 地址开始,引导扇区中的代码开始执行。这个代码通常会初始化一些基本的硬件设置,然后加载操作系统或其他引导加载程序。
三、进一步解释
从零开发操作系统-第二天汇编语言、BIOS以及Makefile介绍 中的汇编也用到了 jump 命令
ORG 0x7c00
JMP entry
刚开始,我一直不明白,为什么《30天自制操作系统》一书作者说 entry 的地址就是 0x7c00,现在明白了,因为程序的装载地址为 0x7c00,而 entry 又是的程序入口点,所以它的地址为 0x7c00。这个 JMP 也设置了 CPU 的PC寄存器地址为 0x7C00,后续 CPU 会从这里开始执行。
四、总结
文章深入探讨了计算机启动过程中CPU和BIOS的相互作用,以及引导扇区在启动过程中的关键作用。作者通过解释硬件复位、CPU初始化、BIOS执行、硬件检测、引导过程以及执行引导扇区代码等步骤,为读者提供了对操作系统启动过程以及 0x7c00 的全面理解。