operating-system - 在没有 BIOS 服务 INT 13 的情况下从软盘加载操作系统镜像

标签 operating-system linux-device-driver bootloader disk bios

如何在启动 PC 时将操作系统镜像从软盘加载到内存而不使用 BIOS 服务?

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

我知道我需要使用“磁盘 Controller ”来处理。 我是否需要在 [BIT 16] 实模式下编写某种“设备驱动程序”?可能吗?

最佳答案

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

FDC(软盘 Controller )属于 ISA(行业标准架构)时代,当时 I/O 端口被硬编码到特定地址。 FDC 有多种变体,但大多数都遵循标准规则。最初的 756 是一种常见的 FDC,后来的(以今天的标准来看仍然非常古老) Controller 遵循 82077AA 变体。

这些 Controller 有十二 (12) 个寄存器,使用八 (8) 个 I/O 字节地址,即 Base + 00h 到 Base + 07h。 (请注意,一个 I/O 地址可以是两个寄存器,如果一个是读取,一个是写入。)您可以读取和写入这些寄存器来指示 FDC 执行某些操作,例如启动驱动器 1 的电机。 (有趣的是:您知道 FDC 最初能够处理四个驱动器吗?)

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

这里有一个问题。如果软盘的前 512 字节(BIOS 已为您加载的 512 字节)内没有所有 FDC 和 DMA 代码,则无法加载其余扇区。例如,您不能将 DMA 代码放在启动代码的第二个扇区中,因为您必须首先使用该 DMA 来加载该扇区。所有 FDC 和 DMA 代码(至少是最低限度的读取服务)必须位于磁盘的第一个扇区中。这很难可靠地做到。

我并不是说这是不可能的,我只是说这是不可能的。一方面,如果你能在 512 字节内(可靠地)做到这一点,我希望看到它。这可能是一个有趣的实验。不管怎样,搜索一下我在这里写的 FDC、DMA 等。网络上有很多例子。如果你想读一本关于它的书,我wrote such a book不久前所有有趣的细节。

关于operating-system - 在没有 BIOS 服务 INT 13 的情况下从软盘加载操作系统镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59135154/

相关文章:

windows - 适用于 Windows 和 Mac 的窗口管理器

node.js - 字符串/缓冲区中的 EOF 文件字符

linux - 何时可以禁用驱动程序中的中断

c++ - 从程序集引导加载程序调用 C++

c - 如何在 C 中正确创建内核并链接到引导加载程序

java - Vista 系统上的请求队列有多长?

unix - Windows 中的 Win 32 API 等 UNIX 的 API 是什么?

linux - LKMG chardev.c 关于register_chrdev 函数的问题

networking - 如何计算非线性 skb/payload 的 TCP/UDP 校验和?

c++ - C++中的引导加载程序