Cosa succede realmente sul moderno hardware PC avviato in modalità MBR BIOS legacy a 16 bit quando si memorizza un byte come '1'
(0x31) nel framebuffer di testo VGA (modalità 03) all'indirizzo lineare fisico B8000
? Quanto è lento un mov [es:di], eax
negozio con l' MTRR per quella regione impostato su UC? ( Test sperimentali su un laptop iGPU di Kaby Lake indicano che clflushopt su WC aveva all'incirca la stessa velocità di UC per la memoria VGA. Ma senza clflushopt, gli archivi mov
nella memoria WC non lasciano mai la CPU e non aggiornano affatto lo schermo, funzionando in modo super veloce .)
Se non è una SMI per ogni negozio, c'è un modo per approssimare questo costo su un pezzo di memoria WB nello spazio utente, per esperimenti sulle prestazioni senza riavviare in modalità reale? (ad esempio utilizzando una pagina BSS come un framebuffer fasullo che in realtà non viene visualizzato da nessuna parte).
Il glifo del carattere corrispondente appare sullo schermo nel prossimo aggiornamento, ma la scansione dell'hardware sta davvero leggendo quel carattere ASCII da VRAM (o DRAM per un iGPU) e la mappatura al glifo dei caratteri bitmap al volo? O c'è qualche intercettazione software su ogni negozio o una volta per vblank, quindi l'hardware reale deve solo gestire un framebuffer bitmap?
È noto che l' avvio del BIOS legacy utilizza la modalità di gestione del sistema (SMM) per emulare USB kbd / mouse come dispositivi PS / 2. Mi chiedo se sia utilizzato anche per il framebuffer in modalità testo VGA. Suppongo che sia utilizzato per le porte I / O VGA per l'impostazione della modalità, ma è plausibile che un framebuffer di testo possa essere supportato dall'hardware. Tuttavia, la maggior parte dei computer trascorre tutto il loro tempo in modalità grafica, quindi tralasciando il supporto HW per la modalità testo sembra che qualcosa che i venditori potrebbero voler fare. (OTOH questo blog suggerisce che un controller VGA verilog homebrew può implementare la modalità testo in modo abbastanza semplice.)
Sono particolarmente interessato ai sistemi che utilizzano l'iGPU in Intel Skylake, ma sarei interessato alle iGPU precedenti / successive di Intel e AMD e alle GPU discrete nuove o vecchie.
(Compresi fornitori diversi da AMD e NVidia; ci sono alcune schede madri Skylake con slot PCI, non PCIe. Se i moderni driver del firmware GPU emulano la modalità testo, presumibilmente ci sono alcune vecchie schede video PCI con modalità testo VGA hardware. E forse una tale scheda potrebbe rendere i negozi solo una transazione PCI anziché una SMI.)
Il mio desktop è un i7-6700k in un mobo Asus Z170 Pro Gaming, nessuna scheda aggiuntiva solo iGPU con un monitor 1920x1200 sull'uscita DVI-D. Non conosco i dettagli del sistema Kaby Lake i5-7300HQ su cui sta testando @Eldan, solo il modello di CPU.
Ho trovato il brevetto US20120159520 del BIOS Phoenix del 2011 ,
Emulazione di video legacy usando uefi . Invece di richiedere i venditori di hardware video per la fornitura sia UEFI e 16 bit driver opzione-ROM nativi modalità reale, propongono un driver in modalità reale VGA ( int 10h
funzioni e così via) che chiama un driver video UEFI fornito dal produttore tramite ganci SMM.
Abstract
[...] La ROM di opzione video generica notifica a un driver SMM video generico la richiesta di servizi video. Tale notifica può essere eseguita utilizzando un interrupt di gestione del sistema software (SMI). Dopo la notifica, il driver SMM video generico notifica a un driver video UEFI di terze parti la richiesta di servizi video. Il driver video di terze parti fornisce i servizi video richiesti al sistema operativo. In questo modo, un driver grafico UEFI di terze parti può supportare un'ampia varietà di sistemi operativi, anche quelli che non supportano nativamente i protocolli di visualizzazione UEFI.
Gran parte della descrizione riguarda la gestione di int 10h
chiamate e cose come quella che già ovviamente intrappolano attraverso l'IVT, quindi può facilmente eseguire codice personalizzato che attiva intenzionalmente una SMI. La parte rilevante è ciò che descrivono per i negozi diretti nel framebuffer in modalità testo che devono funzionare anche per il codice che non attiva interruzioni software o hardware. (A parte HW che attiva SMI in tali negozi, che dicono di poter usare se supportati.)
Supporto buffer di testo
[0066] In alcune forme di realizzazione, le applicazioni possono manipolare direttamente il buffer di testo del VGA . In una tale forma di realizzazione, il driver SMM video generico 130 lo supporta in due modi, a seconda che l'hardware fornisca il trapping SMI sull'accesso in lettura / scrittura alla regione di memoria 740 KB-768 KB (dove si trovano i buffer di testo).
[0067] Quando è disponibile il trapping SMI, l'hardware genera un SMI su ogni accesso in lettura o scrittura. Utilizzando l'indirizzo trap della trap SMI, è possibile calcolare la colonna e la riga di testo esatte e accedere alla riga e colonna corrispondente nella schermata di testo virtuale.
In alternativa, la memoria normale è abilitata per questa regione e, utilizzando una SMI periodica, il driver SMM video generico 130 cerca le modifiche nel buffer di testo hardware emulato e aggiorna la schermata di testo virtuale corrispondente gestita dal driver video. In entrambi i casi, quando viene rilevata una modifica, il personaggio viene ridisegnato nella schermata di testo virtuale.
Questo è solo un brevetto del fornitore del BIOS e non ci dice in che modo funziona la maggior parte dell'hardware o se altri fornitori fanno cose diverse. Esso essenzialmente conferma che alcuni hardware esistente che intrappolano lattina sui negozi in tale intervallo, però. (A meno che non sia solo un'ipotetica possibilità che abbiano deciso di coprire nel loro brevetto.)
Per il caso d'uso che ho in mente, il trapping solo sull'aggiornamento dello schermo sarebbe molto più veloce del trapping su ogni negozio, quindi sono curioso di sapere quale hardware / firmware funzioni in questo modo.
Motivazione per questa domanda
Ottimizzazione di un contatore decimale ASCII incrementale nella RAM video su Intel Core di settima generazione : memorizzazione ripetuta di nuove cifre per un contatore di testo ASCII negli stessi pochi byte di RAM video.
Ho testato una versione del codice nello spazio utente a 32 bit sotto Linux, su memoria WB, sperando di approssimare la situazione movnti
e diversi modi per far sì che la CPU sincronizzi il suo buffer WC con la RAM video dopo ogni negozio (o forse occasionalmente in un interruzione del timer). Ma questo non è realistico se la situazione del bootloader in modalità reale non è solo l'archiviazione su DRAM, ma invece il trigger di una SMI.
Sulla memoria WB, svuotare i movnti
negozi con a lock xor byte [esp], 0
è leggermente più veloce che svuotare clflushopt
. Ma @Eldan non segnala alcun miglioramento della velocità per coloro che sono nella memoria VGA dopo aver programmato un MTRR per renderlo WC. (E la stessa velocità dell'originale facendo normali negozi, indicando che per impostazione predefinita il framebuffer VGA era UC. Alcuni BIOS più vecchi avevano un'opzione per creare WC di memoria VGA , che chiamavano USWC = Uncached Speculative Write Combining.)
Non è un problema del mondo reale, quindi non sto cercando soluzioni alternative reali ; anche se sarebbe interessante sapere se la memorizzazione manuale di pixel byte in una modalità grafica VGA potrebbe essere molto più veloce.
Sommario
- Qualcuno / tutti i veri sistemi moderni attivano una SMI in ogni negozio al framebuffer in modalità testo?
- Se no, possiamo approssimare un archivio WC + clflush al framebuffer, usando un movnti + qualcosa nello spazio utente sulla memoria del bilanciamento del bianco? Quindi possiamo facilmente creare profili
perf
per i contatori delle prestazioni. - Se BIOS e / o hardware diversi utilizzano strategie diverse, quali sono tali strategie? (Non voglio dettagli, solo un livello elevato come "SMI ogni vblank per sincronizzare il framebuffer VGA con l'effettivo framebuffer hardware")
- Una scheda video PCIe o PCI con modalità testo VGA hardware sarebbe più veloce di qualsiasi altra GPU integrata effettivamente? Immagino che una vera transazione di scrittura PCIe sarebbe più lenta dell'attesa che un negozio colpisca la DRAM, ma che una scrittura PCIe sarebbe più economica di una SMI su ogni negozio. Un confronto ballpark / ordine di grandezza sarebbe interessante.
Queste domande sono tutte strettamente correlate, ma posso dividerlo se non ci sono così tante sovrapposizioni come mi aspetto.
perf
perché Linux non è ancora stato avviato. La valutazione della latenza SMI (System Management Interrupt) su macchine Linux-CentOS / Intel ha alcuni dettagli su come contare le SMI.
MSR_SMI_COUNT=0x34
senza dover prima programmare un contatore.