计算机启动时,将首先执行BIOS中的代码。但是,BIOS中的代码如何加载到RAM中以便执行?
我提到了这个问题- 启动时BIOS是从BIOS芯片中读取还是复制到RAM中?。但是,这让我更加困惑。如果BIOS是从ROM加载的,并且ROM是单独的芯片,那么谈论RAM中的段地址有什么意义呢?另外,BIOS代码在哪里加载-它是在实模式地址空间的最后1 MiB还是其他位置?
如果有人可以列出从计算机启动到执行第一条BIOS指令(包括所使用的内存地址)的步骤,那将非常有帮助
计算机启动时,将首先执行BIOS中的代码。但是,BIOS中的代码如何加载到RAM中以便执行?
我提到了这个问题- 启动时BIOS是从BIOS芯片中读取还是复制到RAM中?。但是,这让我更加困惑。如果BIOS是从ROM加载的,并且ROM是单独的芯片,那么谈论RAM中的段地址有什么意义呢?另外,BIOS代码在哪里加载-它是在实模式地址空间的最后1 MiB还是其他位置?
如果有人可以列出从计算机启动到执行第一条BIOS指令(包括所使用的内存地址)的步骤,那将非常有帮助
Answers:
正如我在对该问题的回答中所写的那样,在该问题上获得的民间智慧(不幸的是在该问题上得到了其他答案(在SuperUser中的其他地方)得到了体现)在1991年左右就被世界所卡住,尽管有大量的技术参考资料可以解释。现在情况如何。
如果您已经阅读了我的回答,就不会感到困惑,因为您一开始就不会询问“从ROM加载BIOS”。
正如我之前所写,在现代PC中,机器固件存储在非易失性RAM中。它不是以前的ROM。有关连接到LPC总线的NVRAM芯片的详细信息,请参见前面的答案。(例如:在我打字时在我旁边拆卸的机器上,装有固件的NVRAM是Pm49FL004T,这是LPC闪存RAM芯片。)
32位CPU不能以实模式启动,也不能以低于1MiB行的地址开头。与16位x86处理器相比,这已经是数十年的陈旧废品。它们以俗称的虚幻模式开始,在我先前的回答中,我再次详细介绍了自80386出现以来的实际情况。他们从实际上位于32位地址空间顶部的地址加载第一条指令FFFFFFF0
。
在我之前的回答中,我详细地告诉了您机器固件主要在32位和64位x86机器上映射到物理地址空间的位置。切记:RAM和ROM都是内存。物理地址是系统总线上的内存地址。它们可以寻址RAM或ROM。(他们甚至还可以解决其他问题,但这只会使讨论变得复杂。)物理地址FFFFFFF0
比512KiB范围的顶部低16个字节,而在非易失性RAM中,固件的顶部512KiB 始终映射在512KiB范围内。系统总线由“芯片组”组成。
在处理器初始化或重置时,不会发生某些神话般的ROM芯片的“加载”。装有固件的芯片是非易失性RAM。在整个电源循环中,它会保留其内容(在“闪烁”时写入)。CPU会使用物理内存地址通过系统总线以及通过芯片组连接到系统总线的LPC总线(可能还有LPC / FWH桥)从固件中读取固件指令和数据。