X86 今天的BIOS怎么能超过64KB?

X86 今天的BIOS怎么能超过64KB?,x86,bios,X86,Bios,首先,BIOS大小限制为段大小(0xFFFF)。但是现在很多BIOS都比64KB大,通常超过10MB。它是如何做到这一点的?现代固件不能在16位实模式下运行;它在引导后很快切换到保护模式或长模式。(它可以包含非代码图像) (这是一个有点手舞足蹈的回答,因为我不知道我头脑中的具体细节。我认为在堆栈溢出之前,有关BIOS映射到哪里和/或启动时CPU跳转到什么CS:IP的相关问题已经出现) 如果您告诉固件加载传统BIOS引导扇区(即以传统模式而不是UEFI引导),则它必须切换回真实模式 在这种情况下,

首先,BIOS大小限制为段大小(0xFFFF)。但是现在很多BIOS都比64KB大,通常超过10MB。它是如何做到这一点的?

现代固件不能在16位实模式下运行;它在引导后很快切换到保护模式或长模式。(它可以包含非代码图像)

(这是一个有点手舞足蹈的回答,因为我不知道我头脑中的具体细节。我认为在堆栈溢出之前,有关BIOS映射到哪里和/或启动时CPU跳转到什么CS:IP的相关问题已经出现)

如果您告诉固件加载传统BIOS引导扇区(即以传统模式而不是UEFI引导),则它必须切换回真实模式


在这种情况下,IDK固件保持加载的量;在处理
int 10h
和其他旧式PC BIOS调用时,它可能会切换到保护模式并返回,以访问实模式代码无法覆盖的内存。

64KiB限制始终是硬件限制,而不是软件限制。 主要的一点是重新控制从内存到固件闪存ROM的内存访问。
这就是允许更大的闪存的全部条件,但历史是复杂的


CPU通过至少一个外部芯片访问固件(用于获取指令或数据)。
现代的等级制度是这样的:

Core --[QPI/UPI]--> System Agent --[DMI]--> PCH --[SPI/LPC]--> FLASH ROM
较旧的是:

CPU --[FSB]--> North Bridge/MCH --[DMI/Proprietary]--> South Bridge/ICH --[LPC] --> FLASH ROM
CPU --[BUS]--> System Controller --> FLASH ROM
更古老的是:

CPU --[FSB]--> North Bridge/MCH --[DMI/Proprietary]--> South Bridge/ICH --[LPC] --> FLASH ROM
CPU --[BUS]--> System Controller --> FLASH ROM
注:闪存ROM通常通过SuperIO芯片或嵌入式控制器连接到LPC

为了允许CPU访问固件,一些内存地址被窃取并重定向到闪存ROM。
这是通过配置CPU和闪存ROM之间的所有中间节点来完成的

此窗口的大小设置为64KiB或128KiB(对应于
0xf0000-0xfffff
0xe0000-0xfffff
),但这是一个设计决策(允许640KiB的RAM和320/256KiB的扩展ROM)。
可以将窗口设计为512KB或更大(尽管RAM会受到限制)

无论如何,该窗口被设置为64KiB,如果更改,则会破坏软件,因此它没有(也没有)扩展。
当386问世时,CPU可以寻址超过1MiB(+64KiB-16B),实际上这是286中的“原型”,具有24位地址空间,机会来了

通电时,CPU开始从
CS:IP=0xf000:0x0fff
获取指令,就像16位CPU一样,但是(由于段寄存器内部的工作方式),此逻辑地址不会转换为
0xffff0
(与16位CPU的情况相同),而是转换为
0xfffff0
(低于4GiB限制的16字节)。
这样做是为了向后兼容(软件可见的
CS:IP
对保持不变),同时允许映射更大的闪存ROM。
当然,4GiB附近的地址也需要重定向(被盗)到闪存ROM

固件窗口的大小对4GiB地址空间的影响不如1MiB地址空间大,因此4GiB地址空间的窗口更大。
此窗口的大小可以根据需要设置为任意大(与其他系统设备兼容),但有一个缺点(实际上是两个)

  • 在4GiB-18MiB上,有一个不总是可访问的区域被LAPIC(CPU内部块)遮挡,该区域是可移动的,可以禁用,但默认情况下它位于4GiB-18MiB。
    因此,比如说,30MB的闪存ROM将部分无法访问
  • PCH SPI模块最多支持8MB的窗口 固件怎么可能是20MB? 如今,固件主要由四个组件组成:

    • UEFI/BIOS
    • 情报员告诉我
    • 1Gbs以太网
    • RAID控制器
    以上讨论的窗口仅适用于UEFI/BIOS。
    ME固件有自己的窗口,以太网和raid控制器是PCIe设备,可以利用任何PCI窗口


    在综合中,固件被分割成多个组件,其中大部分遵循PCI(e)设计。其余的都有足够大的特殊内存窗口

    那么,为什么仍然说BIOS仅限于一个段大小呢?
    因为当CPU从
    0xfffffff0
    引导时,它实际上处于16位/32位混合模式,在“内存结束”(4GiB限制之前)之前只有16个字节,但任何远跳转都将按照16位规则重新加载
    CS
    ,将CPU限制在1MiB下限内。
    因此,旧的64KiB/128KiB窗口仍然存在,并映射到闪存的同一区域。

    这允许固件大于16B,并根据需要配置系统(例如,仅将16位服务映射到较低的窗口)

    这是否意味着UEFI/BIOS仍为64KB,但固件的其他组件有其自身的限制?UEFI/BIOS的16位接口仍为64/128KB。这在当时已经足够了,考虑到这些接口几乎没有改变,现在仍然足够了。此窗口中的代码可以切换到32/64位模式并使用上层窗口。我想我已经明白了你的意思。固件可以动态调整“窗口”,使其自身的任何部分映射到系统地址映射,对吗?@noinput是的,它可以这样做