从没有 BIOS 服务的 INT 13 的软盘加载 OS 映像

Posted

技术标签:

【中文标题】从没有 BIOS 服务的 INT 13 的软盘加载 OS 映像【英文标题】:Loading OS image from floppy disk without INT 13 of BIOS Service 【发布时间】:2020-03-26 20:14:53 【问题描述】:

如何在没有 Bios 服务的情况下在启动我的 PC 时将操作系统映像从软盘加载到内存?

我使用的唯一方法是在实模式下调用 int13h。

我知道我需要处理“磁盘控制器”。 我需要在 [BIT 16] 实模式下编写某种“设备驱动程序”吗?可以吗?

【问题讨论】:

是的,您必须使用某些 I/O 端口(如果我们谈论 x86 平台)进行直接 I/O,并且基本上在您的代码中重新实现 BIOS 需要以某种方式运行的软盘驱动程序无论如何. 感谢您告诉我!你知道它的更多细节吗? 你可以拿SeaBIOS源代码。你是开源项目。 【参考方案1】:

正如 0andriy 所说,您必须绕过 BIOS 直接与软盘控制器通信。 (顺便说一句,你为什么要做这样的事情?BIOS 是专门制作的,所以你不必这样做。仅仅是因为你想,也许是为了学习如何对 FDC 进行编程?我很好与那个。)

FDC(软盘控制器)属于 ISA(工业标准架构)时代,当时 I/O 端口被硬编码到特定地址。 FDC 有许多变体,但大多数都遵循标准规则。最初的 756 是一种常见的 FDC,后来(按照今天的标准仍然很老)控制器采用 82077AA 变体。

这些控制器有十二 (12) 个寄存器,使用八 (8) 个 I/O 字节地址,Base + 00h 到 Base + 07h。 (请注意,一个 I/O 地址可以是两个寄存器,一个是读,一个是写。)您对这些寄存器进行读写以指示 FDC 执行操作,例如启动驱动器 1 的电机。 (为了好玩:你知道 FDC 最初能够处理四个驱动器吗?)

这并不难做到,但现在您必须有某种方式让 ISA 总线与 FDC 和主存储器进行通信。出现了 DMA(直接内存访问)。现在您还必须对 DMA 进行编程以进行传输。

这就是问题所在。如果您在软盘的前 512 个字节中没有所有 FDC 和 DMA 代码,BIOS 已经为您加载了 512 个字节,则无法加载剩余的扇区。例如,您不能将 DMA 代码放在引导代码的第二个扇区期望调用它,因为您必须首先使用该 DMA 来加载该扇区。所有 FDC 和 DMA 代码,至少是最低限度的读取服务,必须位于磁盘的第一个扇区。可靠地做到这一点是相当困难的。

我不是说不可能,我只是说不可能。一方面,如果你能(可靠地)在 512 字节内完成,我想看看。这可能是一个有趣的实验。无论如何,搜索我在这里写的 FDC、DMA 等。网上有很多例子。如果你想读一本关于它的书,我 wrote such a book 不久前会提供所有有趣的细节。

【讨论】:

请注意,软盘驱动器可能连接到 USB(对于现代真实硬件,USB 软盘驱动器可能比旧的 ISA 软盘控制器不太可能)。试图将旧的 ISA 软盘控制器的驱动程序压缩到(小于)512 字节将是极具挑战性的(尤其是由于软盘介质的臭名昭著的不可靠性以及对非常健壮的错误处理的需求);并且将多个 USB 控制器和 USB 软驱的驱动程序压缩到相同的 512 字节中是完全不可能的。 只是为了好玩,I had to try it。它仅假定第一个控制器和该控制器上的第一个驱动器。它确实需要更多的工作,但它确实表明它可以完成,而无需对控制器进行任何假设,并且如果发现错误,它确实具有错误检查和错误报告。这是一个有趣的实验。 不错;但你明白我对错误处理的意思(例如,没有“重试 3 次以上,可能每秒钟重试一次重置”)。 人力资源部。理论上,BIOS 应该加载第一个扇区(不是前 512 字节),旧的软驱硬件支持 16 KiB 扇区;因此您应该能够格式化具有 16 KiB 扇区/秒的软盘的第一个磁道,并具有 16 KiB 的引导扇区代码。当然,我预计很多计算机的行为都不会正确,并且存在“非常严重”的风险,即它在实践中无法正常工作。

以上是关于从没有 BIOS 服务的 INT 13 的软盘加载 OS 映像的主要内容,如果未能解决你的问题,请参考以下文章

BIOS int 13h 无法读取第一条轨道

USB 硬盘仿真导致磁盘读取失败(BIOS int 13)?

BIOS INT 13H 问题(从驱动器读取扇区)

装linux系统怎么加载RAID驱动,我的硬盘做了RAID5,驱动已经正确装在了USB软盘上面,请哪位高手指导下!

软盘相关知识和通过BIOS中断访问

进 window BIOS禁用软盘的设置