Що насправді відбувається на сучасному комп'ютерному апаратному забезпеченні, завантаженому в 16-бітному застарілому режимі BIOS MBR, коли ви зберігаєте байт, такий як '1'
(0x31) у кадрі буфера тексту VGA (режим 03) за фізичною лінійною адресою B8000
? Наскільки повільним є mov [es:di], eax
магазин з MTRR для цього регіону на рівні UC? ( Експериментальне тестування на одному ноутбуці iGPU Kaby Lake показало, що clflushopt на WC був приблизно такою ж швидкістю, як і UC для VGA-пам'яті. Але без clflushopt, mov
запам'ятовується в пам'яті WC ніколи не залишає процесор і не оновлює екран взагалі, працює дуже швидко .)
Якщо це не SMI для кожного магазину, чи є який-небудь спосіб наблизити цю вартість на шматок пам'яті WB в користувальницькому просторі, для експериментів із ефективністю без фактичної перезавантаження в реальний режим? (наприклад, використовуючи сторінку BSS як фреймбуфер, який фактично ніде не відображається).
Відповідний гліф шрифту з’явиться на екрані під час наступного оновлення, але чи справді сканування апаратних засобів читає, що ASCII-символ із VRAM (або DRAM для iGPU) та відображає бітові карти шрифтів на лету? Або є перехоплення програмного забезпечення в кожному магазині або один раз на vblank, так що справжнє обладнання має працювати лише з растровим кадром?
Старий завантажувальний BIOS добре відомий для використання режиму управління системою (SMM) для емуляції USB kbd / миші як пристроїв PS / 2. Мені цікаво, чи він також використовується для текстового режиму VGA framebuffer. Я припускаю , що це буде використовуватися для портів виведення для режиму встановлення VGA I / , але це правдоподібно , що текст фреймбуфер може підтримуватися апаратно. Однак більшість комп’ютерів проводять весь свій час у графічному режимі, тому відмова від підтримки HW для текстового режиму, здається, щось, що можуть захотіти зробити виробники. (OTOH цей блог дозволяє припустити, що контролер VGA-контролера для домашніх програм може реалізувати текстовий режим досить просто.)
Мене спеціально цікавлять системи, які використовують 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-бітних реальних режимів драйверів ROM-драйверів, вони пропонують драйвер VGA у реальному режимі ( int 10h
функції тощо), який викликає постачальник відео-драйверів UEFI через гачки SMM.
Анотація
[...] Універсальний варіант відеосигналу ROM повідомляє загальний драйвер SMM для відео про запит на відеопослуги. Таке повідомлення може виконуватися за допомогою переривання управління програмною системою (SMI). Після повідомлення, загальний драйвер SMM для відео повідомляє третій сторонній відео-драйвер UEFI про запит на відео послуги. Сторонній драйвер відео надає операційній системі запитувані відеопослуги. Таким чином, графічний драйвер UEFI третьої сторони може підтримувати найрізноманітніші операційні системи, навіть ті, які не підтримують оригінальні протоколи відображення UEFI.
Значна частина опису охоплює обробку int 10h
дзвінків та подібні речі, які вже очевидно потрапляють через IVT, таким чином можна легко запустити спеціальний код, який спеціально запускає SMI. Відповідна частина - це те, що вони описують для прямого зберігання в текстовий режим фреймбуфера, який повинен працювати навіть для коду, який не викликає жодних перерв програмного чи апаратного забезпечення. (За винятком HW, що викликає SMI в таких магазинах, які, за їхніми словами, вони можуть використовувати, якщо підтримуються.)
Підтримка текстового буфера
[0066] У певних варіантах здійснення програми можуть безпосередньо маніпулювати текстовим буфером VGA . У такому варіанті здійснення загальний драйвер 130 SMM для відео підтримує це одним із двох способів, залежно від того, чи забезпечує апаратне забезпечення захоплення SMI на доступ для читання / запису для області пам'яті 740 KB-768 KB (де розташовані текстові буфери).
[0067] Коли доступний захоплення SMI, апаратне забезпечення генерує SMI на кожному доступі для читання або запису. Використовуючи адресу пастки SMI-пастки, може бути обчислений точний текстовий стовпець і рядок, а також відповідні рядки та стовпці на екрані віртуального тексту.
Крім того, для цього регіону включена нормальна пам'ять, і, використовуючи періодичний SMI, загальний драйвер SMM для відео 130 сканує зміни в емуляційному текстовому буфері апаратури та оновлює відповідний віртуальний текстовий екран, що підтримується драйвером відео. В обох випадках, коли виявлена зміна, символ перемальовується на екрані віртуального тексту.
Це лише один патент постачальника BIOS і не говорить нам, яким способом працює більшість апаратних засобів, або якщо інші постачальники роблять різні речі. Це фактично підтверджує, що існує деяке обладнання, яке може захоплювати магазини в цьому асортименті. (Якщо тільки це не є гіпотетичною можливістю, яку вони вирішили охопити у своєму патенті.)
Що стосується конкретного випадку, я маю на увазі, захоплення лише на оновлення екрана було б набагато швидше, ніж лову на кожному магазині, тому мені цікаво, яке обладнання та прошивка працює в якому напрямку.
Мотивація до цього питання
Оптимізація нарощування десяткових лічильників ASCII у відео оперативній пам’яті 7-го покоління Intel Core - багаторазове зберігання нових цифр для текстового лічильника ASCII в тих самих кількох байтах відео оперативної пам’яті.
Я протестував версію коду в 32-розрядному просторі користувача під Linux, на WB-пам’яті, сподіваючись наблизити ситуацію до movnti
та різними способами змусити ЦП синхронізувати свій WC-буфер до відео оперативної пам’яті після кожного магазину (або, можливо, періодично в перерва таймера). Але це не реально, якщо ситуація завантажувача в реальному режимі не просто зберігається в DRAM, а натомість викликає SMI.
На WB-пам’яті промивання movnti
магазинів із a lock xor byte [esp], 0
дещо швидше, ніж промивання clflushopt
. Але @Eldan не повідомляє про покращення швидкості для пам'яті VGA після програмування MTRR, щоб зробити її WC. (І така ж швидкість, як і для оригінальних магазинів, що вказує на те, що за замовчуванням VGA framebuffer був UC. Деякі старі BIOS мали можливість зробити WC-пам'ять VGA , яку вони назвали USWC = Uncached Specurative Write Combining.)
Це не реальна проблема, тому я не шукаю реальних обхідних ситуацій ; хоча було б цікаво знати, чи зберігати вручну піксельні байти у графічному режимі VGA може бути набагато швидше.
Підсумок
- Чи спрацьовує будь-яка / всі реальні сучасні системи SMI в кожному магазині до текстового режиму фреймбуфера?
- Якщо ні, то чи можемо ми наблизити WC-магазин + clflush до фреймбуфера, використовуючи movnti + щось у користувальному просторі на WB-пам’яті? Тому ми можемо легко профайлювати
perf
показники ефективності. - Якщо різні BIOS та / або апаратні засоби використовують різні стратегії, що це за стратегії? (Я не хочу деталей, просто високий рівень на зразок "SMI кожен vblank для синхронізації VGA framebuffer з фактичним апаратним framebuffer")
- Чи буде відеокарта PCIe або PCI з апаратним VGA текстовим модулем бути швидшою, ніж будь-які інтегровані GPU? Я здогадуюсь, що фактична транзакція запису PCIe була б повільнішою, ніж очікування, коли магазин потрапить на DRAM, але запис PCIe буде дешевшим, ніж SMI у кожному магазині. Цікавим було б порівняння бального парку / порядку масштабу.
Ці питання дуже пов'язані між собою, але я можу розділити це, якщо не буде стільки перекриттів, скільки я очікую.
perf
оскільки Linux ще не завантажився. Оцінка затримки SMI (System Management Interrupt) на машині Linux-CentOS / Intel містить деякі подробиці про те, як можна рахувати SMI.
MSR_SMI_COUNT=0x34
не потрібно спочатку програмувати лічильник.