gpt4 book ai didi

post - BIOS如何初始化DRAM?

转载 作者:行者123 更新时间:2023-12-03 09:56:58 24 4
gpt4 key购买 nike

我一直在寻找关于BIOS现在如何工作相当一段时间的解释。我已经设计了一个引导加载程序,并在成功初始化IDT和GDT的同时跳入了32位模式,但是这样做的时候,我发现“操作系统”似乎非常简单,并且感觉就像“BIOS”是每台计算机的实际操作系统。
因此,现在我面临着一个新的挑战,即尝试发现BIOS实际上是如何自我初始化,发现有多少可用的RAM以及如何/在何处将附加卡ROM导入RAM。据我了解,处理器不是通过跳转而是自动在16位段:偏移地址0xFFFF:0x0000处开始在RAM内部执行代码。这意味着从技术上讲,由于处理器的启动位置,所有计算机从一开始就必须至少具有1MB的RAM才能启动,并且由于这些知识,我一直假设所有BIOS会在启动之前自动将自身写入RAM。处理器获取其RST信号。我觉得这是不对的,因为我相信可以通过BIOS禁用“影子BIOS”。我到处都在寻找《 BIOS设计指南》,但是我似乎总是空手而归。
作为一名程序员,我知道可能有很多方法可以真正完成我实际要问的事情,并且 hell 中不可能给出一个正当的直截了当的答案,如果我必须更具体一点,那就说我在工作我使用Dell Inspiron 518或至少一台装有G33芯片组的计算机(G33北桥和ICH9南桥),并且我想对初始的Pre-POST程序进行编程,并构建带有所有标准中断的我自己的16位IDT和可能会成功启动其他操作系统(例如Windows 10)的所有所需内容。 BIOS实际上如何知道有多少RAM?它只是在最高的内存区域进行位写入位读取测试,然后从那里下来吗?附加卡ROM甚至如何加载到RAM中?据我了解,BIOS建立了一个非常基本的中断和/或“入口点”列表,附加卡ROM可以利用这些中断和/或“入口点”,并使它们能够“锁存”其他BIOS的中断,例如“$ PMM”? BIOS制造商如何知道BIOS中需要什么确切的 anchor 字符串才能启动Windows之类的操作系统?
任何答案,以及任何推荐的规范和/或任何指南都可以帮助我了解我一直在寻求的知识,将非常有帮助。例如,也许有一个指导说:“在移交给IPL之前,BIOS需要完成的最低限度要求的过程?”甚至是C或Assembly中的源代码示例,它可以告诉我附加卡的ROM镜像实际上是什么或看起来是什么样的,这将非常有帮助。

最佳答案

由于我最熟悉英特尔架构,因此我只能将其答案限于此。

您(以及我)正在查找的文档称为《 BIOS编写器指南》,很遗憾,该文档是 secret 的,并且到目前为止尚未泄漏(AFAIK)。
为了在开放源代码社区中推广其产品,英特尔发布了Firmware Support Package。这被认为类似于固件编写器的库,并且包含用于初始化内存 Controller ,PCH(外围 Controller 中枢,非正式地称为“芯片组”)和CPU1的(二进制)代码。
开源开发人员或通常不起不起与英特尔签署保密协议(protocol)的任何开发人员都可以使用FSP编写自己的固件。
可以逆转FSP(我的许多TODO之一),但是将其用作引用会更快。
当电源打开时,在CPU从复位向量2开始执行之前发生了很多事情,但是要记住的重要一点是芯片组(即PCH)已经允许CPU访问闪存ROM。
实际上,这就是第一条指令的执行方式,因为CPU只能从内存地址空间中提取指令。
因此,只要固件将执行流程保持在映射到闪存ROM的内存区域内(此区域由闪存ROM本身中的闪存描述确定,PCH就会在重置期间读取它并配置内存请求的路由)相应地),其代码即可执行。
由于内存尚未初始化,并且闪存ROM是只读的(没有内存写周期),因此无法使用以下功能:

  • 调用。由于它们需要可写的堆栈。
  • 内存中的
  • 变量。由于它们很好,因此各不相同。

  • 两者都是令人讨厌的点,在汇编中,您可以使用跳转和寄存器来解决它们,但是在C中,则不能。
    因此,固件所做的第一件事通常是设置“临时RAM”。
    这是FSP的 TempRamInit()例程(顺便说一句,必须通过跳转来调用它),实际上,它设置了RAM缓存(CAR)。
    高速缓存
    想法是将缓存用作临时RAM。
    基本要点是,缓存行不会过期,仅当没有更多空间可以容纳来自内存的新请求行时,它们才会被驱逐。
    因此,只要您足够小心以避免访问更多适合高速缓存的变量,CPU只会从高速缓存读取和写入(当然,这需要回写式高速缓存模式)。
    但是,这需要仔细定位变量,并且确实非常脆弱。
    更好的方法是启用缓存(通过清除 CD寄存器中的 CR0(禁用缓存)位),然后从与L13一样大的内存区域进行虚拟读取(甚至写入)。
    然后您再次禁用缓存,此模式实际上称为无填充模式,在该模式下,不会在缓存中引入新行(因此不会“丢失”任何现有行),但仍会在缓存中命中读写。
    这允许几KiB的“RAM”。
    存在用于CAR环境的C编译器。
    初始化RAM
    现在,固件可以初始化RAM,为此必须完成三件事:
  • 告诉内存 Controller 有关DIMM的时序(完全是CAS,RAS)。
  • 告诉内存 Controller 有关DIMM的大小和等级。
  • 设置路由。

  • 通过PCI配置空间和MMIO对内存 Controller 进行了配置,您可以在处理器数据手册第2卷(假设MC位于CPU芯片中)中找到详细信息。
    例如, 8th and 9th generation core datasheet vol 2包含存储 Controller 寄存器的描述。这是固件可以设置tRAS参数的摘录:
    Example of the MC registers
    类似地,您会找到DIMM大小和类型, channel 大小等的寄存器:
    Another example
    Yet another
    这些寄存器覆盖点1和2(以及点3,具体取决于定义),但是固件如何知道要使用的值?
    毕竟,DIMM是可更换的。
    如前所述,解决方案是 Serial Presence Detect (SPD),这是一个集成在DIMM上的小型EEPROM,用于描述内存时序,拓扑和大小。
    EEPROM通过I2C兼容总线进行访问。
    在Intel体系结构中,实际使用的总线是SMBus(系统管理总线),它与I2C兼容并且是适当创建的。
    SMBus主文件位于PCH中,并记录在相关系列的数据手册第2卷中。
    例如 PCH series 200 datasheet vol 2
    必须先配置SMBus主机,然后才能使用它,但这非常简单。配置完成后,就可以用来读取SPD数据。
    这与访问任何其他I2C设备完全一样。
    SPD EEPROM(当然每个DIMM可以有多个)保留了从0x50到0x57的地址(在200 PCH系列上)。
    可以写入SPD,并且SMBus主设备中存在一些禁用这种行为的位:
    SPD write disable
    读取SPD数据后,可以配置MC,然后可以使用RAM。
    这是FSP的FspMemoryInit()例程。
    最后一步是配置路由。
    这包括在内存地址空间中设置RAM区域的末尾(有关完整图片,请参阅PCH数据表),在NUMA系统中,源地址和目标地址解码器可通过QPI/UPI在套接字之间路由内存请求链接。
    所有这些都是通过PCH中集成设备的PCI配置空间完成的。
    在NUMA系统中,必须引导其他应用处理器(每个插槽一个)来配置它们的内存 Controller 。
    这是通过LAPIC发出的处理器间中断(IPI)来完成的,LAPIC是每个CPU中的MMIO组件。
    概括
    固件执行的粗略步骤是:
  • 执行任何基本环境初始化(例如,切换到32位模式)。
  • 初始化缓存为RAM。
  • 使用PCI枚举在PCH中初始化SMBus主设备。
  • 读取每个DIMM的SPD EEPROM。
  • 使用SPD数据配置每个套接字的内存 Controller 。
  • 配置PCH内存映射。
  • 配置NUMA路由。

  • 1 CPU不需要初始化,实际上,在调用FSP初始化例程时,已经执行了许多代码。他们可能意味着对某些或多或少有记录的功能进行“微调”。
    2这里将不讨论它们,但是简要地讲,嵌入式 Controller (用于笔记本电脑,用于台式机的硬连线逻辑)将被打开,一旦启动(使用其集成的ROM),其固件将使用GPIO来打开必要的电源门。董事会。其中一个门为PCH供电,一旦EC固件确定正确的引脚,PCH就会启动自己的固件(称为管理引擎固件,因为它与同一闪存的ME区域内的其余ME代码捆绑在一起) ROM也包含BIOS代码,但从技术上讲,它是Bring-Up,BUP模块)并重置芯片组。芯片组准备就绪后,它将置位CPU的电源良好引脚,然后置位复位/初始化引脚,这将导致CPU开始执行POST,然后在假定具有TXT功能的CPU的情况下,微码取回CPU。来自闪存ROM的固件接口(interface)表,以及来自SINIT ACM(系统初始化身份验证控制模块,它将设置有计划的启动所必需的安全性)以及BIOS ACM(将执行特定于供应商的任务,可能包括引导)的固件接口(interface)表,跳过旧版重置向量)。最终,BIOS ACM(如果在FIT中未找到BIOS ACM,则为微码)将跳到复位向量。这是旧版引导流程。请注意,遵循任何其他TXT启动的语义(请参阅Intel TXT规范),在采用Cache-as-RAM的特制环境(请参见上文)中执行ACM。
    3据英特尔称,设置了 CD时,不会进行任何行替换。我假设这也不会在更高的缓存中来回移动行。

    关于post - BIOS如何初始化DRAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63159663/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com