【问题标题】:Is it good or bad to use BIOS interrupts for protected mode?将 BIOS 中断用于保护模式是好是坏?
【发布时间】:2018-11-30 17:54:49
【问题描述】:

我已经基于 MikeOS 引导加载程序 (Link) 制作了一个非常基本的引导加载程序。我正在使用 NASM 和 QEMU 进行组装和测试。我正在尝试为我的操作系统启用保护模式。因此,我开始在网上搜索更多详细信息并了解有关 BIOS 中断的更多信息。我偶然发现了维基百科并阅读了一篇文章....

许多现代操作系统(如 Linux 和更新版本的 Windows)完全绕过内置的 BIOS 中断通信系统,更喜欢使用自己的软件直接控制连接的硬件。造成这种情况的最初原因主要是这些操作系统在保护模式下运行处理器,而调用 BIOS 需要切换到实模式并再次返回,并且切换到实模式很慢。但是,不切换到实模式也有严重的安全原因,并且 BIOS 代码在功能和速度上都有限制(来源:维基百科(Link))

维基百科的文章是这样说的

.....主要是这些操作系统在保护模式下运行处理器,而调用BIOS需要切换到实模式再返回,切换到实模式很慢......
(来源:维基百科(Link))

根据我的理解,在保护模式下对all 程序使用太多的BIOS 中断是不可取的,对吗?如果我是对的,那么我的引导加载程序还使用许多 BIOS 中断来在屏幕上打印字符……是好是坏?如果不好,为什么?以及创建打印字符程序需要进行哪些更改?

由于我想让我的操作系统进入保护模式,我很困惑是否应该使用 BIOS 中断?目前我制作了一个仅在屏幕上打印字符串的引导加载程序,目前我的引导加载程序中没有任何其他使用任何 BIOS 中断的功能。如果在保护模式下使用 BIOS 中断不好,当我在保护模式下加载我的内核时(当我制作它时:p)我应该如何处理打印字符串功能?

还有,

许多现代操作系统(如 Linux 和更新版本的 Windows)完全绕过内置的 BIOS 中断通信系统,更喜欢使用自己的软件直接控制连接的硬件。 (来源:维基百科(Link))

这些开发人员如何能够开发这些软件?这些软件是用汇编语言还是其他语言制作的?他们需要深厚的软硬件知识吗?如果可以在我的操作系统中制作这些软件,那么我正在考虑添加这些软件......是否建议这样做,或者我应该只使用 BIOS 中断?

【问题讨论】:

  • 所以在你的头脑中编译它并编写执行这些存储的 NASM 代码。即,将其视为伪代码,显示您需要写入的内存。
  • 很简单的伪代码;如果您完全可以阅读C语法。但是你可以用gcc -c -Os 直接编译它,然后用Agner Fog 的objconv 反汇编器将它反汇编成一个NASM 函数。 agner.org/optimize/#objconv
  • 即使在 MS-DOS 时代,当程序确实在实模式下运行时,许多应用程序还是直接写入视频内存,因为即使不切换模式,使用 BIOS 也很慢。而在原始 PC/AT 中使用的 286 中,没有可用于离开保护模式的机器指令。要退出保护模式,您必须重置处理器(激活重置引脚)并重新开始。这就是“切换到实模式很慢”的起源。当后来的处理器有了更好的方法时,人们已经学会了如何在没有 BIOS 的情况下相处。
  • 不过在旁注中。回到 DOS 时代,EMM386、QEMM /386(Quarterdeck) 等 386 个内存管理器的出现。DOS 通常作为虚拟 VM8086 任务运行,内存管理器在后台有一个 VM8086 监视器。

标签: assembly operating-system nasm interrupt bootloader


【解决方案1】:

您可以在实模式下使用 BIOS 中断,但在进入保护模式或长模式后,您将无法像在实模式下那样使用它。据我所知,这实际上是为了安全。保护模式的全部意义在于增强安全性和稳定性(同时消除了实模式中存在的许多限制),长模式也比保护模式有其自身的一组优势(因为长模式适用于 64 位)。

您有多种选择:

  1. 编写内核模式设备驱动程序以手动实现对功能的支持,而不是依赖 BIOS 中断功能。
  2. 通过虚拟 8086 实现对实模式仿真的支持。我相信早期版本的 Windows(非常非常早期的版本)依赖于此,显然这就是为什么一些非常老的版本有一些冻结错误,但我无法验证这是否确实如此,也无法验证微软是否仍然使用虚拟 8086 实现为了任何东西。无论如何,虚拟 8086 实现将允许您执行 BIOS 中断,尽管您的内核处于保护模式,因为您将模拟实模式。
  3. 从保护模式切换回实模式并返回。在一些英特尔文档中应该有更多关于此的信息,并且在线上有一些信息(例如 OS Dev Wiki,尝试搜索它),但这可能会导致问题,具体取决于您的操作系统内核的工作方式。至少可以说你需要小心它......它很容易把事情搞砸,并且考虑到你已经提出了你的问题,你以稳定的方式实施可能真的很棘手。

如果我是对的,那么我的引导加载程序也会使用许多 BIOS 中断来在屏幕上打印字符...是好是坏?

如果您想在退出实模式(例如进入保护模式或长模式)后将字符打印到屏幕上,您可以直接写入显存。让你知道。

回到讨论 BIOS 中断,这很好,因为您将在那个阶段处于实模式,这是您可以执行 BIOS 中断的地方。但是,如果您尝试在保护模式或长模式下执行此操作,它将不起作用(没有实模式仿真或暂时切换回实模式)。

BIOS 为您提供中断,以便您能够依靠其内部功能来帮助您站稳脚跟,所以不,在实模式下使用 BIOS 中断也不错。

请查看以下链接。

https://wiki.osdev.org/Real_Mode

https://wiki.osdev.org/Virtual_8086_Mode

https://en.wikipedia.org/wiki/Virtual_8086_mode

https://wiki.osdev.org/Protected_Mode

【讨论】:

  • 关于第 2 点。您所说的冻结错误可能是 Win9x 常见的错误。不依赖硬件中断(如视频中断)的 BIOS 调用不是什么大问题,VM8086 任务很好(并且仍然)适合这项工作。当 BIOS 中断依赖于硬件中断(软盘驱动器、计时器、硬盘控制器等)时,就会出现问题。这些在 VM8086 任务中造成了问题,并且为了更加(但不是完全)稳定通常必须阻塞。 Int 13h(磁盘访问)对此特别不利,为什么 windows 磁盘访问经常冻结 Win95
  • 只有在可以在保护模式下运行的磁盘硬件的 32 位驱动程序可用时,情况才会真正得到改善,因为磁盘访问不需要 BIOS 中断。
猜你喜欢
  • 2014-12-14
  • 2011-08-13
  • 2011-04-07
  • 2016-08-13
  • 2020-09-13
  • 2023-03-19
  • 2021-12-22
  • 2014-10-29
  • 2013-02-12
相关资源
最近更新 更多