我知道这个标题听起来有点混乱,有些人可能以为我只是想知道计算机一般如何启动,但事实并非如此。但我现在会为你们理清这个问题:
1.板载固件是大多数现代计算机设备的工作方式,无论是否使用 EFI/UEFI(即使没有“板载固件”,旧计算机仍然采用银行切换,或使用类似方法的嵌入式固件、卡带等)
2.启动时,还没有传统意义上的“程序”在运行,也就是说,没有内核、操作系统、用户应用程序;所有的指令,尤其是最先指令,由指令指针,我猜。如何将 IP/PC/等设置为首先指向 BIOS/固件/等指令的地址,以及 BIOS 指令如何在启动之前在内存中映射自身?
3.除了 MMIO,BIOS 还使用某些 RAM 地址来执行指令。当我问这个问题时,大问题来了...BIOS 是如何做到这一点的?
结论:
我假设在第一个指令中,在完成操作系统启动之前,BIOS 有一个初始硬件设置。我想知道的是,硬件是否设计为始终以这种方式工作,这种启动方法中是否有我遗漏的步骤,是否有我不知道的信息空白,或者这一切从第一个指令开始是如何工作的,以及 RAM 数据本身。
答案1
物理地址空间不必全部指向 RAM。大多数设备(包括固件芯片)也占用了物理地址空间的一部分。它们将控制寄存器和数据缓冲区(如普通内存位置)暴露给 CPU,CPU 将与设备交换命令和数据,就像设备正在读取/写入 RAM 一样。这意味着同一组地址和数据总线可用于内存访问和设备 IO,驱动程序就像任何其他内存操作软件一样。
Windows 设备管理器显示的内存地址图最能证明这一点。
现在,当处理器启动时,指令指针将指向一个已知的特殊地址,比如 0x0,并从那里开始执行。然后,PCB 设计师必须确保固件芯片硬连线以占用从 0x0 开始的物理地址空间。
但实际上,在固件完成初始化之前,处理器可能以完全不同的模式工作(例如,使用不同的指令集或使用内置的硬连线指令)。这将是类似于设备驱动程序的行为,需要操作串行闪存(在大多数设备中)甚至 SD 卡(如 Raspberry Pi 中)。但是,这种访问仍然是通过映射设备内存完成的。