OS/4 - видео без тормозов


Проблема

Многие из вас сталкивались с медленной работой системы из-за ужасающе низкой скорости обмена данными с видеокартой. Попытка померить сокрость обмена данными с видеопамятью на высокоскоростной современной шине PCI-e давала значения в 157 килобайт в секунду. Естественно ни о какой продуктивной работе не могло быть и речи, когда время отрисовки окна измеряется секундами. В чем причина такой низкой скорости? В механизме обеспечения когерентности кэша и памяти, который работает в режиме WB и инициирует сброс кэша при каждой операции записи в видеопамять. Достачтоно установить режим кеширования WC (Write Combine) для LFB (видеопамять) и скорость обмена данными возрастет в десятки раз. Однако, сложность заключается в том, что нужно поменять режим работы кэша процессора только для тех страниц памяти, через которые идет работа с видео, а для остальных страниц - оставить все как есть. При смене режима кэширования необходимо програмировать особые регистры процессора - MSR (model-specific registers). Причем задействованые MSR должны быть записаны одновременно на всех ядрах в многопроцессорной системе. Эта проблема не давала полноценно работать с OS/2 несколько лет до появления последних версий драйвера Panorama.

SNAP

Исторически видеодрайвер SNAP пытался использовать механизм MTRR для выставления режима WC для видеобуфера. Однако этот способ работал далеко не на всех материнских платах.

Решение первое - Panorama

В драйвере Panorama было предложено первое решение проблемы. Для этого атрибуты страниц относящихся к буферу видеопамяти патчились на лету после загрузки системы и режим кэширования изменялся. Решение жизнеспособное,но работающее не всегда стабильно. В частности было замечено, что в случае наличия в системе 4 Гигабайт оперативной памяти и более из-за ошибки в программе эффекта достичь не удавалось. Позднее ошибка была исправлена, но механизм изменения работы кэша переехал в драйвер ACPI.PSD (в связи с необходимостью программирования MSR и одновременно записи этого регистра на всех ядрах процессора), который в свою очередь не во всех режимах работает с ядром OS/4. Таким образом, чтобы использовать драйвер Panorama с высокой скоростью передачи данных по видеошине требуется установить драйвер ACPI.PSD, а к нему крайне желательно стандартный загрузчик от IBM и старое IBM-овское ядро, кторое уже более 10 лет не обновлялось. Плюс сам механизм программирования MSR крайне сложно реализовать за пределами ядра системы. Из-за чего правильная установка регистров работала не всегда корректно, что приводило к периодическим случаям медленной работы системы в одном из ста случаев после загрузки.

Решение второе - OS/4

В проекте OS/4 было предложено свое более правильное и архитектурно грамотное решение. Драйвер screen01.sys был переписан и расширен по функциональности. Заодно, чтобы не путаться он был переименован в screen03.sys. В драйвере добавлена установка правильного режима работы кеша для буффера видеопамяти. Теперь это делается более прямым методом, нежели в связке драйверов Panorama + ACPI.PSD.

Новое ядро OS/4 предоставляет особый сервис для мапинга физики. Специфика драйвера заключается в том, что программист сразу может задать необходимый тип кеширования через расширенный API. Этот особый сервис и использует screen03. Панорама сама не мапит LFB, а отправляет запрос на такое действие в драйвер screen$. Новый драйвер экрана понимает, что панарама просит мапинг LFB и говорит ядру замапить область памяти c типом кеширования WС.

И конечно же этот метод без проблем позволяет использовать и самое новое ядро проекта OS/4 и драйвер os4apic.psd.

Кроме отрисовки всей основной графики, система мапит LFB еще в двух местах - для курсора и для dive. Чтобы получить поддержку обработки отрисовки курсора и прямого обращения к видеобуферу (dive) необходимо заменить две DLL, поправленные на предмет работы через новый драйвер screen03.sys.

Важно отметить, что эти dll теперь работают только с драйвером screen03.sys и использовать их со стандартным IBM-овским ядром нельзя! Чтобы собрать конфигурацию, позволяющую запускать разные ядра на одной системе воспользуйтесь возможностью создавать несколько разных файлов config.sys и указывать свой конфиг для запуска конкретного ядра. В config.sys пропишите соответсвующие пути для каждого пункта загрузки.

Новый сервис OS/4 ядра KernVMAlloc2 позволяет задавать любой тип кэширования при выделении памяти. И воспользоваться им может любой драйвер. Предположим, что нужно замапить регистры. По умолчанию они замапятся как WB, что очень неудобно. Если программист хочет что-нибудь записать в такой регистр, то следующей командой он обязательно должен из него прочитать содержимое. Только в этом случае из кеша процессора происходит реальная запись данных в регистр. А с новым сервисом при мапинге регистров можно указывать тип кеширования UC. И никаких лишних операций делать не придется.

Igor Vaskov,
10 марта 2014


Новые статьи на нашем сайте:


Комментариев к странице: 5 | Добавить комментарий
Домой | Проект ядро Core/2 | Проект OS/4 Download | Новости | Гостевая книга | Подробно обо всем | Нужные программы | Проекты | OS/2 FAQ | Всячина | За и Против | Металлолом | #OS2Russian | RDM/2 | Весёлые картинки | Наша галерея | Доска объявлений | Карта сайта | ПОИСК | ФОРУМ