Co tak naprawdę dzieje się na nowoczesnym sprzęcie komputerowym uruchomionym w 16-bitowym starszym trybie BIOS MBR, gdy zapisujesz bajt taki jak '1'
(0x31) w buforze ramki tekstu VGA (tryb 03) pod fizycznym adresem liniowym B8000
? Jak wolno mov [es:di], eax
sklep z MTRR dla tego regionu jest ustawiony na UC? ( Testy eksperymentalne na jednym laptopie Kaby Lake iGPU wskazują, że clflushopt na WC miał mniej więcej taką samą prędkość jak UC dla pamięci VGA. Ale bez clflushopt, mov
przechowywanie w pamięci WC nigdy nie opuszcza procesora i nie aktualizuje ekranu w ogóle, działa bardzo szybko .)
Jeśli nie jest to SMI dla każdego sklepu, czy jest jakiś sposób na przybliżenie tego kosztu w części pamięci WB w przestrzeni użytkownika, do eksperymentów wydajnościowych bez ponownego uruchamiania w trybie rzeczywistym? (np. użycie strony BSS jako udawanego bufora ramki, który tak naprawdę nigdzie się nie wyświetla).
Odpowiedni glif czcionki pojawia się na ekranie przy następnym odświeżeniu, ale czy sprzętowe skanowanie naprawdę czyta ten znak ASCII z VRAM (lub DRAM dla iGPU) i mapuje na glify czcionek bitmapowych w locie? Czy jest jakiś program przechwytujący oprogramowanie w każdym sklepie lub raz na vblank, więc prawdziwy sprzęt musi obsługiwać tylko bufor bitmapowy?
Starsze uruchamianie systemu BIOS jest dobrze znane z używania trybu zarządzania systemem (SMM) do emulacji USB kbd / myszy jako urządzeń PS / 2. Zastanawiam się, czy jest on również używany w buforze ramek w trybie tekstowym VGA. Zakładam, że jest używany do portów we / wy VGA do ustawiania trybu, ale prawdopodobne jest, że bufor ramek tekstowych mógłby być obsługiwany przez sprzęt. Jednak większość komputerów spędza cały czas w trybie graficznym, więc pominięcie obsługi HW dla trybu tekstowego wydaje się być czymś, co producenci mogą chcieć zrobić. (OTOH ten blog sugeruje, że kontroler VGA homebrew verilog może w prosty sposób zaimplementować tryb tekstowy.)
Szczególnie interesują mnie systemy wykorzystujące iGPU w Intel Skylake, ale interesują mnie wcześniejsze i późniejsze iGPU Intela i AMD oraz nowe lub stare dyskretne GPU.
(W tym dostawcy inni niż AMD i NVidia; istnieją płyty główne Skylake ze gniazdami PCI, a nie PCIe. Jeśli współczesne sterowniki oprogramowania układowego GPU emulują tryb tekstowy, prawdopodobnie istnieją pewne stare karty graficzne PCI ze sprzętowym trybem tekstowym VGA. A może taka karta może sprawić, że sklepy będą tylko transakcją PCI zamiast SMI.)
Mój własny pulpit to i7-6700k w Asus Z170 Pro Gaming mobo, bez dodatkowych kart, tylko iGPU z monitorem 1920x1200 na wyjściu DVI-D. Nie znam szczegółów systemu Kaby Lake i5-7300HQ @Eldan testuje, tylko model procesora.
Znalazłem patent Phoenix BIOS US20120159520 z 2011 r. ,
Emulowanie starszego wideo za pomocą interfejsu uefi . Zamiast wymagać od dostawców sprzętu wideo dostarczania zarówno opcji UEFI, jak i natywnych 16-bitowych sterowników opcji ROM w trybie rzeczywistym, proponują sterownik VGA w trybie rzeczywistym ( int 10h
funkcje itp.), Który wywołuje dostarczony przez dostawcę sterownik wideo UEFI za pośrednictwem haków SMM.
Streszczenie
[...] Ogólny ROM opcji wideo powiadamia ogólny sterownik SMM wideo o żądaniu usług wideo. Takie powiadomienie może być wykonane przy użyciu przerwania zarządzania systemem oprogramowania (SMI). Po powiadomieniu ogólny sterownik SMM wideo powiadamia sterownik wideo UEFI innej firmy o żądaniu usług wideo. Zewnętrzny sterownik wideo zapewnia żądane usługi wideo dla systemu operacyjnego. W ten sposób sterownik grafiki UEFI innej firmy może obsługiwać wiele różnych systemów operacyjnych, nawet tych, które nie obsługują natywnie protokołów wyświetlania UEFI.
Znaczna część opisu obejmuje obsługę int 10h
wywołań i tego typu rzeczy, które już wyraźnie przechwytują IVT, dzięki czemu można łatwo uruchomić niestandardowy kod, który celowo uruchamia SMI. Istotną częścią jest to, co opisują dla bezpośrednich sklepów w buforze ramek w trybie tekstowym, które muszą działać nawet w przypadku kodu, który nie wyzwala żadnego przerwania programowego ani sprzętowego. (Inne niż HW wyzwalające SMI w takich sklepach, które, jak twierdzą, mogą używać, jeśli są obsługiwane).
Obsługa bufora tekstowego
[0066] W niektórych przykładach wykonania aplikacje mogą bezpośrednio manipulować buforem tekstowym VGA . W takim przykładzie wykonania ogólny sterownik SMM wideo 130 obsługuje to na jeden z dwóch sposobów, w zależności od tego, czy sprzęt zapewnia pułapkę SMI przy dostępie do odczytu / zapisu w obszarze pamięci 740 KB-768 KB (gdzie znajdują się bufory tekstowe).
[0067] Gdy pułapka SMI jest dostępna, sprzęt generuje SMI przy każdym dostępie do odczytu lub zapisu. Korzystając z adresu pułapki pułapki SMI, można obliczyć dokładną kolumnę i wiersz tekstowy oraz uzyskać dostęp do odpowiedniego wiersza i kolumny na wirtualnym ekranie tekstowym.
Alternatywnie, normalna pamięć jest włączona dla tego regionu i, używając okresowego SMI, ogólny sterownik SMM wideo 130 skanuje w poszukiwaniu zmian w emulowanym sprzętowym buforze tekstowym i aktualizuje odpowiedni wirtualny ekran tekstowy obsługiwany przez sterownik wideo. W obu przypadkach po wykryciu zmiany znak jest przerysowywany na wirtualnym ekranie tekstowym.
To tylko patent jednego producenta BIOS-u i nie mówi nam, w jaki sposób działa większość sprzętu, ani czy inni dostawcy robią różne rzeczy. Zasadniczo potwierdza to, że istnieje jakiś sprzęt, który może pułapki na sklepy w tym zakresie. (Chyba że jest to tylko hipotetyczna możliwość, którą postanowili objąć patentem).
Jeśli chodzi o przypadek użycia, który mam na myśli, przechwytywanie tylko podczas odświeżania ekranu byłoby znacznie szybsze niż wychwytywanie w każdym sklepie, więc jestem ciekawy, który sprzęt / oprogramowanie układowe działa w jaki sposób.
Motywacja do tego pytania
Optymalizacja inkrementującego licznika dziesiętnego ASCII w pamięci RAM wideo w Intel Core 7. generacji - wielokrotne zapisywanie nowych cyfr licznika tekstu ASCII w tych samych kilku bajtach pamięci RAM wideo.
Przetestowałem wersję kodu w 32-bitowej przestrzeni użytkownika pod Linuksem, w pamięci WB, mając nadzieję na przybliżenie sytuacji movnti
i różne sposoby zmuszenia procesora do synchronizacji bufora WC z RAM wideo po każdym sklepie (a może czasami w przerwanie timera). Nie jest to jednak realistyczne, jeśli sytuacja w trybie bootowania w trybie rzeczywistym nie polega tylko na przechowywaniu w pamięci DRAM, ale zamiast tego powoduje uruchomienie SMI.
W pamięci WB opróżnianie movnti
sklepów za pomocą a lock xor byte [esp], 0
jest nieco szybsze niż opróżnianie za pomocą clflushopt
. Ale @Eldan zgłasza brak poprawy prędkości dla osób korzystających z pamięci VGA po zaprogramowaniu MTRR w celu uzyskania WC. (I ta sama prędkość, co w przypadku oryginalnych sklepów normalnych, co wskazuje, że domyślnie buforem ramki VGA był UC. Niektóre starsze BIOS-y miały opcję utworzenia WC pamięci VGA , którą nazwali USWC = Uncached Speculative Write Combination.)
To nie jest problem w świecie rzeczywistym, więc nie szukam rzeczywistych obejść ; chociaż byłoby interesujące wiedzieć, czy ręczne przechowywanie bajtów pikseli w trybie graficznym VGA mogłoby być znacznie szybsze.
Podsumowanie
- Czy jakieś / wszystkie naprawdę nowoczesne systemy wyzwalają SMI w każdym sklepie do bufora ramki tekstowej?
- Jeśli nie, czy możemy zbliżyć sklep WC + kliknięcie bufora ramki za pomocą movnti + czegoś w przestrzeni użytkownika w pamięci WB? Możemy więc łatwo profilować
perf
za pomocą liczników wydajności. - Jeśli różne BIOS-y i / lub sprzęt używają różnych strategii, jakie są te strategie? (Nie chcę szczegółów, tylko wysoki poziom, taki jak: „SMI co vblank do synchronizacji bufora ramki VGA z rzeczywistym buforowaniem ramki sprzętowej”)
- Czy karta graficzna PCIe lub PCI ze sprzętowym trybem tekstowym VGA byłaby szybsza niż cokolwiek, co faktycznie robią zintegrowane karty graficzne? Zgaduję, że faktyczna transakcja zapisu PCIe byłaby wolniejsza niż oczekiwanie na trafienie pamięci DRAM do sklepu, ale zapis PCIe byłby tańszy niż SMI w każdym sklepie. Interesujące byłoby porównanie ballpark / rzędu wielkości.
Wszystkie te pytania są ze sobą ściśle powiązane, ale mogę to rozdzielić, jeśli nie nakładam się tak bardzo, jak się spodziewam.
perf
ponieważ Linux nie jest jeszcze uruchomiony. Ocena opóźnienia SMI (przerwanie zarządzania systemem) na komputerze z systemem Linux-CentOS / Intel zawiera pewne szczegóły dotyczące sposobu liczenia SMI.
MSR_SMI_COUNT=0x34
bez konieczności wcześniejszego programowania licznika.