Как может BIOS больше чем 64KB сегодня? - PullRequest
2 голосов
/ 20 мая 2019

AFAIK, размер BIOS ограничен размером сегмента (0xFFFF).Но многие BIOS сегодня имеют размер более 64 КБ, обычно более 10 МБ.Как это может сделать это?

Ответы [ 2 ]

5 голосов
/ 20 мая 2019

Ограничение 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 ГБ больше.
Размер этого окна может быть настолько большим, насколько это необходимо (для совместимости с другими системными устройствами), но есть одна загвоздка (фактически два).

  1. В 4GiB-18MiB есть не всегда доступная область, затененная LAPIC (внутренний блок ЦП), эта область является подвижной и может быть отключена, но по умолчанию она составляет 4GiB-18MiB.
    Так что флэш-ПЗУ, скажем, 30 МБ, будет частично недоступен.
  2. Модуль 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-битные сервисы в нижнее окно).

0 голосов
/ 20 мая 2019

Современная прошивка не работает в 16-битном реальном режиме; он переключается в защищенный или длительный режим вскоре после загрузки. (И может содержать изображения без кода).

(Это довольно волнистый ответ, потому что я не знаю конкретных деталей, которые мне не нравятся. Я думаю, что ранее в Stack Overflow уже возникали вопросы о том, где отображается BIOS и / или какая CS : IP, к которому процессор переходит при загрузке).

Если вы сообщаете своей прошивке о загрузке устаревшего загрузочного сектора BIOS (то есть о загрузке в устаревшем режиме вместо UEFI), то он должен переключиться обратно в реальный режим.

В этом случае IDK, сколько прошивки остается загруженным; он может переключиться в защищенный режим и обратно при обработке int 10h и других устаревших вызовов ПК-BIOS, чтобы получить доступ к памяти, которую код реального режима не может быть перезаписан.

...