【发布时间】:2020-11-19 09:38:09
【问题描述】:
很长一段时间以来,我一直在寻找有关 BIOS 究竟如何工作的解释。我设计了一个引导加载程序,并在成功初始化 IDT 和 GDT 的同时跳到了 32 位模式,但这样做,我发现“操作系统”似乎很简单,感觉好像“ BIOS”是每台计算机的实际操作系统。
所以现在我接受了一个新的挑战,试图发现 BIOS 是如何实际初始化自身的,发现有多少 RAM 是可用的,以及附加卡 ROM 是如何/从何处导入到 RAM 中的。据我了解,处理器不是通过跳转,而是自动开始在 RAM 内的 16 位段执行代码:偏移地址 0xFFFF:0x0000。这意味着从技术上讲,所有计算机最初必须至少有 1MB 的 RAM 才能启动,因为处理器的起始位置,并且由于这些知识,我一直假设所有 BIOS 在处理器得到它的RST信号。我觉得这不是真的,因为这正是我相信可以通过 BIOS 禁用的“影子 BIOS”。我一直在到处寻找“BIOS 设计者指南”,但是,我总是空手而归,似乎阅读了每一个规范。
作为一名程序员,我知道可能有很多方法可以真正完成我实际要求的事情,而且可能根本没有办法给出一个体面的直截了当的答案,如果我必须更具体,请说我正在使用 Dell Inspiron 518,或者至少是一台包含 G33 芯片组(G33 北桥和 ICH9 南桥)的计算机,我想编写初始 Pre-POST 程序,并使用所有的标准中断以及可能成功启动另一个操作系统(例如 Windows 10)所需的一切。 BIOS 如何真正知道有多少 RAM?它是否只是在最高存储区域进行位写入位读取测试并从那里向下?附加卡 ROM 是如何加载到 RAM 中的?据我了解,BIOS 构建了一个非常基本的中断列表和/或附加卡 ROM 可以利用的“入口点”,并赋予它们“锁定”其他 BIOS 中断(例如“$PMM”)的能力? BIOS 制造商如何知道他们的 BIOS 中需要哪些确切的锚字符串才能启动像 Windows 这样的操作系统?
任何答案以及任何推荐的规范和/或任何能够引导我了解我一直在寻找的知识的指南都会非常有帮助。比如一个指南说“在移交给 IPL 之前需要由 BIOS 完成的最低要求的过程?”甚至是 C 或汇编中的源代码示例,其中包含可以向我展示附加卡的 ROM 映像实际上是什么或看起来像什么的东西,这将非常有帮助。
【问题讨论】:
-
好像“BIOS”是每台计算机的实际操作系统。 - 仅当您编写一个只使用 BIOS 调用的玩具内核,而不是真正的实际驱动程序时计算机真正拥有的硬件。特别是如果它更像是一个独立的程序,而不是一个具有进程管理的完整操作系统。确实,BIOS 确实需要在从磁盘加载 UEFI 或 legacy-BIOS-MBR 引导加载程序之前使用缓存作为 RAM(无填充)模式来初始化 DRAM 时序等超级重要的东西。但是一个合适的操作系统会接管所有的内存,包括 BIOS 正在使用的任何内存; BIOS 只是初始化硬件,不会保持活动状态。
-
这真的取决于芯片组。在旧机器上,RAM 在启动时确实可用。在更现代的机器上,CPU 实际上以一种特殊的缓存即 RAM 模式启动,其中不使用外部 RAM。此外,现代 CPU 在实模式下并不是真正从
ffff:0000开始的。 BIOS 对你隐藏了很多这些东西。 -
(当然,在系统管理模式下,SMI 中断仍然可以在真正的操作系统背后做一些事情,因此在 Linux 等操作系统启动后 BIOS 不会“保持运行”并不总是完全正确的.)
-
@fuz 上电或复位后,Intel x86 处理器将处于实模式(参见 Intel @ 987654321@) 并将在 F000:FFF0 处开始执行。 IIRC,80286 CPU 只能通过复位进入保护模式(然后不能再离开它),但所有必要的表等都在复位之前设置好了。
-
@prl 最新的英特尔(服务器?)CPU 开始在处理器内部执行代码,以验证英特尔提供给主板制造商的固件中的特殊代码块。然后执行该特殊代码,形成英特尔可信执行技术的信任根。然后,该特殊代码开始在 CS.base = 0xFFFFFFF0 和 EIP = 0 的实模式下正常执行固件。我不确定它是否记录了 CPU 在此之前运行的模式。