2009-07-22 12 views
19

Circa 15 anni fa, ero solito divertirmi e infastidire il mio insegnante di CS scrivendo un codice errato che avrebbe modificato direttamente il testo sul monitor. Questo è stato/è fatto facilmente accedendo alla memoria video a 0xB8000 su PC compatibili con VGA.Dove si trova il buffer video di textmode se non si trova su 0xB8000?

Avanti veloce ad oggi, ho deciso di provare il mio vecchio trucco attraverso una porta di debug che mi dà accesso alla memoria fisica. Per la mia gratificazione, ha funzionato ancora sulla prima piattaforma su cui l'ho provato. Poi, scoraggiato, ho scoperto che non funziona su molti altri sistemi. Sembra che i sistemi su cui non funziona abbiano tutti la grafica UMA (memoria condivisa).

Quindi, una domanda per tutti voi scrittori BIOS, ragazzi OS di basso livello e guru dei driver video - se sono in normale modalità testo a colori 80x25 su un sistema compatibile con PC con memoria grafica condivisa, in modalità reale, e il contenuto di 0xb8000 - 0xB8FFF è tutto 0xFF invece di darmi cosa c'è sullo schermo, dove è finito il buffer dello schermo?

+0

Giusto per confermare, sei in vera modalità reale, e non una console "DOS" in esecuzione su Windows, corretta? – David

+3

Modalità reale, onesta a dio (è una schermata di configurazione del BIOS che sto acquisendo). –

risposta

13

Ah, se si tratta di una schermata del BIOS, tutte le scommesse sono disattivate. Il fatto che sia un BIOS su una scheda madre con una grafica integrata appoggia le cose ancora di più a favore della stranezza del video.

In tutte le probabilità, la funzionalità VGA "classica" è per tutti gli effetti emulata. Con una scheda video esterna questo sarebbe invisibile al BIOS - vede ancora una scheda video VGA. Ma un BIOS cablato sulla scheda video non avrebbe bisogno di configurare il falso layer VGA e la mappatura della memoria dello spazio degli indirizzi a 20 bit della vecchia scuola solo per incollare del testo sullo schermo.

Invece il BIOS può interfacciarsi direttamente con la scheda (tramite qualche modalità proprietaria) fino a quando il sistema operativo non sarà effettivamente avviato, a quel punto esegue la mappatura della memoria stessa.Questo ha un grande vantaggio in quanto per una scheda che condivide la memoria principale, non si ottiene una schermata vuota all'avvio se la RAM è installata in modo non corretto (invece la modalità BIOS proprary delle schede video potrebbe utilizzare un buffer normalmente riservato per qualche altro scopo, consente di accedere al BIOS e vedere 0 MB di RAM installata)

+3

Sì, sono stato informato da un collega che il bios di Phoenix utilizza la modalità 12 ore. Le informazioni video sono lì a 0xA0000, ma sono tutti pixel, non caratteri ascii. Bummer. Risposta giusta, ma un fiasco ;-) –

4

Le schede CGA (scheda grafica a colori) e MDA (scheda di visualizzazione in bianco e nero) hanno utilizzato regioni diverse. Uno (colore) è 0xB8000; ma la monocromia inizia da 0xB0000. Ricorda che potresti avere entrambi i display attivi sulla macchina contemporaneamente.

Vedere DOS Memory Map (anche se ha un errore di battitura nell'offset per CGA - dovrebbe essere 8000h non 0800h).

Per quanto riguarda VGA (Video Graphics Array) va, la sua memoria inizia inferiore, al confine 640K a 0xA0000 e continua per 64K - ma può andare al di là, come la carta potrebbe avere fino a 256K. Alcuni sample code for programming VGA is here. Ma non è così semplice in quanto ha più modalità video. Si potrebbe provare here per qualche aiuto.

Sei sicuro di avere VGA e non EGA o XGA o Super-VGA? Tutti hanno una semantica leggermente diversa ... Ma comunque, sono abbastanza sicuro che qualcuno di questi dovrebbe inserire il testo allo 0xB0000 o 0xB8000. Cosa succede quando si digita o

MODE MONO 

o

MODE CO80

- fa che influiscono sulla visualizzazione? Quelli passerebbero da una modalità di testo adattatore all'altra, sotto DOS.

+0

Ho scansionato tutto da 0xB0000 a 0xBFFFF - è tutto spazzatura (0xFF). La memoria a 0xC0000 è il BIOS VGA come previsto; questo mi permette di sapere che il mio metodo di accesso alla memoria funziona, ma non mi aiuta ad afferrare il contenuto dello schermo ... –

0

Potrebbe essere che la memoria virtuale sia abilitata in quel punto.

Ad es., Stavo cercando di scrivere sul buffer video nella base di codice iPXE e non si rifletteva sullo schermo. Dopo aver esaminato, mi sono reso conto che avevo bisogno di chiamare la funzione:

phys_to_virt(0xB8000); 

per essere in grado di scrivere al buffer video direttamente.