Ultima modifica:
Parto col dire che sono in totale confusione, e forse quello che dirò sarà sbagliato.
Avevo intenzione di scrivere un piccolo programma che facesse uso del chip VGA per operazioni di video Output.
Ho capito che la VGA dispone di molti registri interni, più di 300, che sono mappati tramite il Port Mapped I/O(PMIO), questo vuol dire che l'accesso ai registri interni della VGA avviene attraverso determinate istruzioni di I/O messe a disposizione dalla CPU, per esempio nella famiglia x86 abbiamo le seguenti:
Subito dopo ho compreso che la VGA dispone di una memoria interna che viene adoperata per memorizzare i dati da visualizzare a video, quest'ultima in modalità testo si estende dall'indirizzo fisico B8000h fino a l'indirizzo BFFFFh, si suddivide in 8 pagine video delle quali solo la prima comporta modifiche a video.
La VRAM della VGA è mappata in memoria RAM tramite MMIO(Memory mapped I/O), questo vuol dire che è possibile apportare modifiche a questa memoria utilizzando le sole istruzioni di trasferimento dati messe a disposizione dalla CPU(ess. mov, stosw, etc.).
Qui inizia a confondermi la situazione, il MMIO consiste nel mappare determinati indirizzi di memorie centrali all'interno della memoria RAM, facendo si che quando un determinato indirizzo venga scritto sull'Address Bus, se quest'ultimo corrisponde a uno degli indirizzi compresi nell'area di memoria mappata in RAM, il dispositivo mappato recepisca l'indirizzo e svolge il suol compito.
Esempio:
Scrivo nella locazione di memoria avente indirizzo fisico B8000h il dato 23h, l'indirizzo B8000h verrà scritto sull'Address Bus, ma non verrà recepito dalla RAM bensì dalla VGA che riconoscendo l'indirizzo scriverà il dato nella determinata locazione della VRAM.
Adesso il problema principale è uno, lo espongo con un esempio(con questa confusione gli esempi mi escono meglio):
Supponiamo di avere un piccolo computer che dispone di 32KiB RAM, di una VGA con memoria interna di 32KiB, e di una CPU con 16 pin di indirizzo, quindi può indirizzare fino a 64KiB di memoria, i primi 32KiB dello spazio di indirizzamento è dedicato alla RAM(Memoria bassa) e nei 32KiB alti è mappata la VRAM(memoria alta), se il processore scrive sull'Address Bus un indirizzo su 15 bit, per esempio 8000h, la RAM recepirà l'indirizzo e il processore scriverà/leggerà il dato nell'ultima locazione della RAM, se il processore scriverà sull'Address Bus un indirizzo su 16bit del tipo 8001h, allora il dato verrà letto/scritto nella VRAM, in quanto supera lo spazio di indirizzamento basso e scrive i dati in quello alto nella quale e mappata la VRAM.
(già così mi puzza la situazione).
Se invece la RAM fosse di 64KiB e la VRAM di 32KiB(mappata in memoria), e il processore ha uno spazio di indirazzmento di 64KiB questo vuol dire che non potremmo mai usare le locazione dopo il 32KiB di memoria RAM, in quanto dopo quell'indirizzo è mappata la VRAM, giusto? Non è uno spreco enorme di memoria.
Sicuramente non è tutto corretto, qualcuno che mi possa spiegare ciò?
Avevo intenzione di scrivere un piccolo programma che facesse uso del chip VGA per operazioni di video Output.
Ho capito che la VGA dispone di molti registri interni, più di 300, che sono mappati tramite il Port Mapped I/O(PMIO), questo vuol dire che l'accesso ai registri interni della VGA avviene attraverso determinate istruzioni di I/O messe a disposizione dalla CPU, per esempio nella famiglia x86 abbiamo le seguenti:
Codice:
in al/ax, Imm8/16
out Imm8/16, al/ax
La VRAM della VGA è mappata in memoria RAM tramite MMIO(Memory mapped I/O), questo vuol dire che è possibile apportare modifiche a questa memoria utilizzando le sole istruzioni di trasferimento dati messe a disposizione dalla CPU(ess. mov, stosw, etc.).
Qui inizia a confondermi la situazione, il MMIO consiste nel mappare determinati indirizzi di memorie centrali all'interno della memoria RAM, facendo si che quando un determinato indirizzo venga scritto sull'Address Bus, se quest'ultimo corrisponde a uno degli indirizzi compresi nell'area di memoria mappata in RAM, il dispositivo mappato recepisca l'indirizzo e svolge il suol compito.
Esempio:
Scrivo nella locazione di memoria avente indirizzo fisico B8000h il dato 23h, l'indirizzo B8000h verrà scritto sull'Address Bus, ma non verrà recepito dalla RAM bensì dalla VGA che riconoscendo l'indirizzo scriverà il dato nella determinata locazione della VRAM.
Adesso il problema principale è uno, lo espongo con un esempio(con questa confusione gli esempi mi escono meglio):
Supponiamo di avere un piccolo computer che dispone di 32KiB RAM, di una VGA con memoria interna di 32KiB, e di una CPU con 16 pin di indirizzo, quindi può indirizzare fino a 64KiB di memoria, i primi 32KiB dello spazio di indirizzamento è dedicato alla RAM(Memoria bassa) e nei 32KiB alti è mappata la VRAM(memoria alta), se il processore scrive sull'Address Bus un indirizzo su 15 bit, per esempio 8000h, la RAM recepirà l'indirizzo e il processore scriverà/leggerà il dato nell'ultima locazione della RAM, se il processore scriverà sull'Address Bus un indirizzo su 16bit del tipo 8001h, allora il dato verrà letto/scritto nella VRAM, in quanto supera lo spazio di indirizzamento basso e scrive i dati in quello alto nella quale e mappata la VRAM.
(già così mi puzza la situazione).
Se invece la RAM fosse di 64KiB e la VRAM di 32KiB(mappata in memoria), e il processore ha uno spazio di indirazzmento di 64KiB questo vuol dire che non potremmo mai usare le locazione dopo il 32KiB di memoria RAM, in quanto dopo quell'indirizzo è mappata la VRAM, giusto? Non è uno spreco enorme di memoria.
Sicuramente non è tutto corretto, qualcuno che mi possa spiegare ciò?