Что в действительности происходит на современном оборудовании ПК, загруженном в устаревшем 16-разрядном режиме BIOS MBR, когда вы сохраняете байт, например '1'
(0x31), в кадровый буфер VGA text (mode 03) по физическому линейному адресу B8000
? Насколько медленно работает mov [es:di], eax
магазин с MTRR для этого региона, установленным в UC? ( Экспериментальное тестирование на одном ноутбуке Kaby Lake iGPU показало, что clflushopt на WC был примерно с той же скоростью, что и UC для памяти VGA. Но без clflushopt, mov
хранилища в памяти WC никогда не покидают ЦП и вообще не обновляют экран, работая очень быстро .)
Если это не SMI для каждого магазина, есть ли способ приблизить эту стоимость куска памяти WB в пространстве пользователя для экспериментов с производительностью без реальной перезагрузки в реальном режиме? (например, используя страницу BSS в качестве притворного кадрового буфера, который фактически нигде не отображается).
Соответствующий глиф шрифта появится на экране в следующем обновлении, но действительно ли аппаратное сканирование считывает этот символ ASCII из VRAM (или DRAM для iGPU) и отображает глифы растрового шрифта на лету? Или есть какой-то программный перехват в каждом магазине или один раз на vblank, так что реальное оборудование должно обрабатывать только растровый буфер кадров?
Хорошо известно, что при загрузке устаревшего BIOS используется режим управления системой (SMM) для эмуляции USB kbd / mouse в качестве устройств PS / 2. Мне интересно, если он также используется для кадрового буфера текстового режима VGA. Я предполагаю , что это будет использоваться для портов вывода для режима установления VGA I / , но это правдоподобно , что текст фреймбуфера может поддерживаться аппаратно. Тем не менее, большинство компьютеров проводят все свое время в графическом режиме, поэтому отказ от поддержки HW в текстовом режиме кажется чем-то, что производители могут захотеть сделать. (OTOH этот блог предполагает, что VGA контроллер homebrew verilog может реализовать текстовый режим довольно просто.)
Я особенно заинтересован в системах, использующих iGPU в Intel Skylake, но был бы заинтересован в более ранних / более поздних версиях iGPU от Intel и AMD, а также в новых или старых дискретных графических процессорах.
(Включая поставщиков, отличных от AMD и NVidia; есть некоторые материнские платы Skylake с PCI-слотами, а не PCIe. Если современные драйверы микропрограммного обеспечения GPU действительно эмулируют текстовый режим, предположительно, есть некоторые старые видеокарты PCI с аппаратным текстовым режимом VGA. И, возможно, такая карта может сделать магазины просто транзакцией PCI вместо SMI.)
Мой собственный рабочий стол - i7-6700k в игровой приставке Asus Z170 Pro Gaming, никаких дополнительных карт - только iGPU с монитором 1920x1200 на выходе DVI-D. Я не знаю деталей системы Kaby Lake i5-7300HQ, которую тестирует @Eldan, только модель процессора.
Я нашел патент Phoenix BIOS US20120159520 от 2011 года ,
эмулирующий устаревшее видео с использованием uefi . Вместо того, чтобы требовать от поставщиков видеооборудования поставки как UEFI, так и собственных 16-разрядных драйверов дополнительного ПЗУ реального режима, они предлагают драйвер VGA реального режима ( int 10h
функции и т. Д.), Который вызывает предоставленный поставщиком драйвер видеокарты UEFI через перехватчики SMM.
Аннотация
[...] Универсальный вариант видео ROM уведомляет универсальный драйвер видео SMM о запросе видеоуслуг. Такое уведомление может быть выполнено с использованием программного прерывания управления системой (SMI). После уведомления общий драйвер видео SMM уведомляет сторонний видео драйвер UEFI о запросе видеоуслуг. Сторонний видеодрайвер предоставляет запрошенные видеоуслуги операционной системе. Таким образом, сторонний графический драйвер UEFI может поддерживать самые разные операционные системы, даже те, которые изначально не поддерживают протоколы отображения UEFI.
Большая часть описания охватывает обработку int 10h
вызовов и тому подобное, которые, очевидно, уже перехватывают IVT, поэтому могут легко запускать пользовательский код, который специально запускает SMI. Соответствующая часть - это то, что они описывают для прямых хранилищ в текстовый режим кадрового буфера, который должен работать даже для кода, который не вызывает программных или аппаратных прерываний. (Кроме HW, запускающего SMI в таких магазинах, которые, по их словам, они могут использовать, если они поддерживаются.)
Поддержка текстового буфера
В определенных вариантах осуществления приложения могут напрямую манипулировать текстовым буфером VGA . В таком варианте осуществления общий драйвер 130 SMM видео поддерживает это одним из двух способов, в зависимости от того, обеспечивает ли аппаратное обеспечение перехват SMI при доступе на чтение / запись к области памяти 740 КБ-768 КБ (где расположены текстовые буферы).
Когда перехват SMI доступен, аппаратное обеспечение генерирует SMI при каждом доступе для чтения или записи. Используя адрес прерывания ловушки SMI, можно рассчитать точный текстовый столбец и строку и получить доступ к соответствующей строке и столбцу на виртуальном текстовом экране.
Альтернативно, для этой области включена нормальная память, и, используя периодический SMI, универсальный драйвер 130 SMM видео сканирует изменения в эмулированном аппаратном текстовом буфере и обновляет соответствующий виртуальный текстовый экран, поддерживаемый видеодрайвером. В обоих случаях при обнаружении изменения символ перерисовывается на экране виртуального текста.
Это всего лишь патент одного производителя BIOS, и он не говорит нам, как на самом деле работает большинство аппаратных средств, или другие производители делают разные вещи. Это, по сути, подтверждает, что существует некоторое оборудование, которое может захватывать магазины в этом диапазоне. (Если только это не гипотетическая возможность, которую они решили покрыть в своем патенте.)
Для варианта использования, который я имею в виду, отслеживание только при обновлении экрана будет намного быстрее, чем отслеживание в каждом магазине, поэтому мне интересно, какое аппаратное обеспечение / прошивка работает каким образом.
Мотивация на этот вопрос
Оптимизация возрастающего десятичного счетчика ASCII в видеопамяти на Intel Core 7-го поколения - многократное сохранение новых цифр для текстового счетчика ASCII в одних и тех же байтах видеопамяти.
Я тестировал версию кода в 32-битном пользовательском пространстве под Linux, в памяти WB, надеясь приблизить ситуацию movnti
и различные способы заставить ЦП синхронизировать свой буфер WC с видеопамятью после каждого хранилища (или, возможно, иногда в прерывание по таймеру). Но это нереально, если ситуация с загрузчиком в реальном режиме не просто сохраняет в DRAM, а вместо этого запускает SMI.
В памяти WB очистка movnti
хранилищ с помощью lock xor byte [esp], 0
несколько быстрее, чем очистка clflushopt
. Но @Eldan не сообщает об улучшении скорости памяти VGA после программирования MTRR, чтобы сделать его WC. (И та же скорость, что и для оригинального хранилища, что указывает на то, что по умолчанию VGA- кадровый буфер был UC. Некоторые старые BIOS имели возможность сделать VGA-память WC , которую они назвали USWC = Uncached Speculartive Write Combining.)
Это не настоящая проблема, поэтому я не ищу реальных обходных путей ; хотя было бы интересно узнать, может ли ручное сохранение пикселей в графическом режиме VGA быть намного быстрее.
Резюме
- Какие-нибудь / все настоящие современные системы запускают SMI в каждом магазине в кадровый буфер текстового режима?
- Если нет, можем ли мы приблизить хранилище WC + clflush к кадровому буферу, используя movnti + что-то в пространстве пользователя в памяти WB? Таким образом, мы можем легко профилировать
perf
для счетчиков производительности. - Если разные BIOS и / или оборудование используют разные стратегии, каковы эти стратегии? (Я не хочу подробностей, просто высокий уровень, такой как «SMI каждые vblank для синхронизации кадрового буфера VGA с фактическим аппаратным кадровым буфером»)
- Будет ли видеокарта PCIe или PCI с аппаратным текстовым режимом VGA быстрее, чем на самом деле встроенные графические процессоры? Я предполагаю, что фактическая транзакция записи PCIe будет медленнее, чем ожидание, когда магазин ударит по DRAM, но запись PCIe будет дешевле, чем SMI в каждом магазине. Сравнение порядка и порядка будет интересным.
Все эти вопросы тесно связаны между собой, но я могу разделить их, если не так много совпадений, как я ожидаю.
perf
потому что Linux еще не загружен. Оценка задержки SMI (прерывания управления системой) на компьютере Linux-CentOS / Intel содержит некоторые подробности о том, как можно рассчитывать SMI.
MSR_SMI_COUNT=0x34
без необходимости сначала программировать счетчик.