Ограничение 64 КБ всегда было аппаратным, а не программным.
Главное - переориентировать доступ к памяти из памяти на прошивку Flash ROM.
Это все, что нужно, чтобы увеличить объем флэш-памяти, но история сложна.
Процессор обращается к микропрограммному обеспечению (для получения инструкций или данных) по крайней мере через один внешний чип.
Современная иерархия похожа на эту:
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
Примечание : флэш-ПЗУ обычно подключается к LPC через микросхему SuperIO или встроенный контроллер.
Чтобы процессор мог достичь встроенного программного обеспечения, некоторые адреса памяти были украдены и перенаправлены на флэш-память.
Это делается путем настройки всех промежуточных узлов между процессором и флэш-памятью.
Размер этого окна был установлен равным 64 КБ или 128 КБ (соответствует диапазонам 0xf0000-0xfffff
или 0xe0000-0xfffff
), но это было дизайнерское решение (позволяющее иметь 640 КБ ОЗУ и 320/256 КБ ПЗУ расширения. ).
Можно было бы создать окно размером 512 КБ или более (хотя объем ОЗУ был бы ограничен).
В любом случае окно было установлено на 64 КБ и изменялось, что могло бы сломать программное обеспечение, поэтому оно не было (и не было) расширено.
Когда вышел 386, процессор мог адресовать более 1 МБ (+ 64 КБ-16B), на самом деле это был «прототип» в 286 с 24-битным адресным пространством, и появилась возможность.
При включении питания CPU начинает извлекать инструкции в CS:IP = 0xf000:0x0fff
, как 16-разрядный процессор, но (благодаря тому, как регистры сегментов работают внутри) этот логический адрес не транслируется в 0xffff0
(как это было в случае с 16-разрядный процессор), но до 0xfffffff0
(16 байтов ниже предела 4 ГБ).
Это сделано для обратной совместимости (пара CS:IP
, видимая для программного обеспечения, остается неизменной) и в то же время для отображения большого флэш-ПЗУ.
Конечно, адреса около 4GiB также должны быть перенаправлены (украдены) на Flash ROM.
Размер адресного окна микропрограммы не влияет на адресное пространство 4 ГБ меньше, чем адресное пространство 1 МБ, поэтому окно на 4 ГБ больше.
Размер этого окна может быть настолько большим, насколько это необходимо (для совместимости с другими системными устройствами), но есть одна загвоздка (фактически два).
- В 4GiB-18MiB есть не всегда доступная область, затененная LAPIC (внутренний блок ЦП), эта область является подвижной и может быть отключена, но по умолчанию она составляет 4GiB-18MiB.
Так что флэш-ПЗУ, скажем, 30 МБ, будет частично недоступен.
- Модуль PCH SPI поддерживает максимум 8 МБ.
Как прошивка может быть 20MiB?
Сегодня прошивка состоит в основном из четырех компонентов:
- UEFI / BIOS
- Intel ME
- 1 Гбит Ethernet
- RAID-контроллер
Описанные выше окна предназначены только для UEFI / BIOS.
Прошивка ME имеет свое собственное окно, Ethernet-контроллер и raid-контроллер являются устройствами PCIe и могут использовать любое окно PCI.
В синтезе встроенное ПО разделено на несколько компонентов, большинство из которых соответствуют конструкции PCI (e). Остальные имеют специальные окна памяти достаточно большого размера.
Так почему до сих пор говорится, что BIOS ограничен размером сегмента?
Потому что, когда процессор загружается с 0xfffffff0
, он фактически находится в смешанном режиме 16-бит / 32-бит, у него есть только 16 байтов до «конца памяти» (до предела 4 ГБ), но любой дальний переход перезагрузит CS
по 16-битному правилу, ограничивающее ЦП нижним пределом в 1 МБ.
Таким образом, старое окно 64 КБ / 128 КБ все еще существует, и оно сопоставлено с той же областью флеш-памяти.
Это позволяет встроенному программному обеспечению быть больше 16B и настраивать систему по мере необходимости (например, отображать только 16-битные сервисы в нижнее окно).