2016-12-30

waqur: (Евро)
После перехода Windows на UEFI-загрузку старые интерфейсы BIOS, такие как int 13h (доступ к диску) и int 10h (управление экраном), казалось бы, могут быть наконец отправлены на пенсию (кроме случаев, когда загрузка происходит в режиме совместимости и в firmware вашего компьютера активизирован модуль CSM). Для вывода текста есть console I/O protocol, для переключения видеорежимов и блитирования есть graphics output protocol, также в UEFI существуют протоколы для считывания EDID-данных с дисплея (в т.ч. родного разрешения LCD матрицы), для доступа к диску и тому подобного.

Однако все эти новые UEFI протоколы становятся недоступными после вызова ExitBootServices() в процессе загрузки платформы, в контексте UEFI-загрузчика (например, такого как BOOTMGR.EFI). Не вызывать эту функцию нельзя, потому что иначе UEFI-загрузчик не перейдёт с CPL=3 на CPL=0, т.е. не возьмёт процессор под свой полный контроль и не сможет передать управление ядру.

А ведь SVGA-драйверу Windows нужно уметь переключать видеорежимы не только во время загрузки, а ещё и например когда пользователь меняет настройки рабочего стола. Поэтому драйвер VIDEOPRT.SYS содержит полнофункциональный эмулятор процессора, с пошаговым исполнением 16-разрядных команд из обработчика int 10h (который переключает видеорежимы, получает EDID-информацию от монитора, осуществляет suspend/resume видеокарты и т.п. — всё это посредством команд IN/OUT, причём разных команд для разных моделей видеокарт; соответствующий 16-разрядный код предоставляет сама видеокарта через option rom).

Таким образом, UEFI firmware должно при инициализации платформы проинсталлировать 16-разрядный код VBE SHIM по адресу 0xC0000, защитить этот регион памяти от записи и так далее (пример, как это делается, можно посмотреть в TianoCore). Ни UEFI firmware, ни Windows никогда не переключают процессор в 16-разрядный режим для прямого выполнения этого кода, но 16-разрядный код по-прежнему остаётся обязательной частью UEFI-платформы, в роли такого себе байткода виртуальной машины.

Когда-то давно, во времена NT 4.0, Windows просто приостанавливала многозадачность, выключала страничную адресацию, запрещала прерывания и помолясь переведя процессор в 16-битный режим, делала прямой вызов BIOS(*). Очевидно, что в эпоху многоядерных процессоров (ядра которых могут активно слать IPI друг другу) и 64-битности, такой финт может закончиться летальным исходом, поэтому в современных версиях Windows драйвер минипорта VGA содержит вышеупомянутый эмулятор, откуда он и перекочевал на UEFI-платформу. В отличие от семёрки и последующих версий, виста при загрузке (во время демонстрации логотипа) ещё и переключается в адовый VGA-режим 680x480 с 16 цветами и планарной видеопамятью по адресу 0xA0000 (где плоскости переключаются через порты VGA-контроллера); редкая комбинация UEFI-прошивки и прошивки видеокарты способна выдержать такое издевательство. Ну а Windows XP/2003 отличается в этом смысле как от предыдущих, так и от последующих версий Windows — она не содержит эмулятор как NT 6.x, но и не делает прямых вызовов BIOS как NT 4; вместо этого она выполняет код VESA BIOS Extensions в режиме виртуального 8086 (т.е. задействует аппаратную эмуляцию 16-битного кода, доступную только когда процессор находится в 32-битном защищённом режиме).

FreeBSD тоже содержит эмулятор 16-битного кода BIOS в драйвере vesa(4), для той же цели — переключение видеорежимов на заранее неизвестной видеокарте после загрузки ядра. Этот драйвер работоспобен в 32-битных и 64-битных ядрах, но только в BIOS/CSM режиме (в режиме UEFI драйвер vesa недоступен, а переключение видеорежимов делается только в загрузчике через UEFI GOP протокол).

Linux не содержит такого эмулятора и может переключать видеорежимы (на заранее неизвестной видеокарте) только до загрузки ядра.




* В ту эпоху такие прямые вызовы BIOS с глобальным остановом всей системы делались отнюдь не только при переключении видеорежимов. Анекдот про Билла Гейтса, который обещает показать, что такое многозадачность в Windows, но только после того, как доформатирует дискету, взялся именно оттуда.

July 2017

S M T W T F S
      1
2345 678
9101112131415
16171819202122
23242526272829
3031     

Автор стиля

Развернуть

No cut tags
Page generated 2017-07-23 04:36 pm
Powered by Dreamwidth Studios