Bios放在falsh里面,刚开始上电的时候,cpu的内存并没有初始化好。那么,它是怎么样启动的呢?
这就要讲到eXecute-In-Place(xip)了。
xip,通俗易懂的来说,就是就地执行,即把bios在flash里面执行。
先来看看wiki上对XIP的一段介绍:
典型的第一阶段引导加载器是一个XIP程序,它链接到在加电时闪存芯片映射的地址上运行,并包含一个最小的程序来设置系统RAM(这取决于单个板上使用的组件,不能进行充分的通用化,以便将正确的序列嵌入到处理器硬件中),然后加载第二阶段引导加载器或OS内核加载到RAM中。 在初始化期间,可写内存可能不可用,因此所有计算都必须在处理器寄存器中执行。出于这个原因,第一阶段引导加载程序倾向于用汇编语言编写,并且只为下一个程序提供一个正常的执行环境。一些处理器要么在芯片本身嵌入少量SRAM[1],要么允许使用板载高速缓存作为RAM[2],以使第一阶段引导加载程序更易于使用高级语言编写。 对于内核或引导加载程序,地址空间通常是内部分配的,因此为了对它们使用XIP,只要指示链接器将不可修改和可修改的数据放置在不同的地址范围中,并提供一种机制,以便在运行任何假定数据可以正常访问的代码之前将可修改的复制到可写内存中即可。这可以作为前一阶段的一部分完成,也可以在程序开始时的一小段代码中完成。 如果地址空间是外部分配的,例如在不提供虚拟内存的系统上运行的应用程序中,编译器需要通过向指向数据区域的私有副本的指针添加偏移量来访问所有可修改数据。在这种情况下,外部加载器负责设置特定于实例的内存区域。 BIOS和UEFI使用XIP初始化主内存。
大概总结一下:意思就是说xip会执行最小代码,这个和大多数的嵌入式设备是一致的,不同的就是直连flash的是pch,怎么样才能把pch内容映射过来?
在CPU上电的时候,programmable attribute map(PAM)寄存器缺省的值会把0x D0000到0xFFFFF的内存decode消息传递到DMI,同样也会把0xFFFD0000到0xFFFFFFF的memory decode传递到DMI。而这里就是系统的reset vector,也就是BIOS的内容所在地。文章来源:https://www.toymoban.com/news/detail-520968.html
PAM范围的内存解码会转到DMI,再通过DMI总线到南桥PCH。PCH会把memory decode的消息传递给SPI的控制器,它会把它翻译成SPI的封包,放到串行的SPI总线上;读到东西后再原路一层层返回,直到CPU。文章来源地址https://www.toymoban.com/news/detail-520968.html
到了这里,关于Bios放在flash里面,如何启动(xip)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!