引导加载过程中关于 CS 和 DS 段寄存器的混淆

问题描述 投票:0回答:1

我一直在通过学习 MIT 的 JOS 课程来学习操作系统开发。现在,我正在深入研究引导加载程序的工作原理以及 x86 计算机体系结构的细节,尤其是内存分段。我最近遇到了一个关于行为的困惑点引导加载过程中的段寄存器。

我了解到,当计算机启动时,BIOS 会初始化系统并将引导加载程序从引导设备加载到内存中,通常从物理地址 0x7C00 开始。然后引导加载程序接管并开始执行,最终加载操作系统。

在此过程中,我对 CS(代码段)和 DS(数据段)寄存器的行为感到困惑。到目前为止我所理解的是:

  1. 最初,当CPU开始执行来自BIOS的指令时,CS寄存器指向包含BIOS代码的段,DS寄存器指向BIOS用于数据操作的默认段。

  2. 当 BIOS 将引导加载程序加载到地址 0x7C00 的内存中并将控制权转移给它时,CPU 开始执行引导加载程序代码中的指令。

这就是我的困惑开始的地方:

  • 一旦 BIOS 完成将引导加载程序加载到内存并将控制权转移给它, CPU的CS段寄存器是否仍然指向BIOS段,或者现在就指向BIOS段 指向加载引导加载程序的段(例如,0x7C00)?

  • 如果 CPU 在此转换之前执行 BIOS 代码以及引导加载程序代码 此时被认为是数据,引导加载程序所在的段是否是 被认为是数据段?那么这是否意味着 CS 和 DS 寄存器都结束了 在此转换后指向相同的内存地址,CPU如何 在这种情况下区分代码和数据?

  • 此时,CS寄存器指向哪个段呢?它是否更新为指向引导加载程序代码所在的段(即包含地址 0x7C00 的段)?还是仍然指向BIOS代码段?

  • 同样,DS寄存器呢?是指向bootloader数据所在的段,还是保留原来的值,指向BIOS数据段?

我已经阅读了有关引导加载程序开发的各种资源和教程,但我还没有找到关于从 BIOS 到引导加载程序的过渡期间如何处理段寄存器的明确解释。

有人可以详细解释一下引导加载过程中如何管理 CS 和 DS 寄存器吗?任何见解、解释或资源将不胜感激。

assembly x86 bootloader osdev bios
1个回答
0
投票

CPU 执行

CS:IP
处的代码。因此,要执行引导加载程序的代码,
CS
必须指向引导加载程序。如果
CS:IP
指向 BIOS,CPU 将执行该 BIOS 指令。

引导加载程序代码是代码,而不是数据。您似乎误解了段寄存器。 8086 有 1 MB 地址空间,但 CS 和 DS 只指向 64 kB 段。您还有 SS、堆栈和额外的 ES,但这仍然不足以一次访问整个 1 MB。这就是为什么您可以动态更改段寄存器。

8086本身不区分代码和数据。你可以有 CS=DS,事实上这是一个常见的设置。 CPU 仍然不会执行该段中的随机内容,而只会执行

CS:IP
处的指令。

代码可以将

DS
设置为任何方便的值。 BIOS 不知道引导加载程序的工作原理,因此它不会尝试变得聪明。

© www.soinside.com 2019 - 2024. All rights reserved.