Based on what I know so far, when you plug an IO device into an IO
port (for example, when you plug a printer into a parallel port), the
printer will be represented to the CPU as just another RAM chip.
È meglio pensare a questo scenario come a 2 dispositivi separati, in cui un dispositivo (il controller della porta parallela) può o non può essere presentato alla CPU come un altro chip RAM (e quasi mai lo è), e l'altro dispositivo ( la stampante) non è affatto presentata alla CPU. Per inviare un byte alla stampante, il driver della stampante chiede al driver del controller della porta parallela di inviare un byte e il driver del controller della porta parallela indica al controller della porta parallela di inviare il byte.
Si noti che i chip RAM hanno una caratteristica speciale: le letture e le scritture non hanno effetti collaterali. Perché non ci sono effetti collaterali è facile usare alcuni trucchi per migliorare le prestazioni; come avere cache, o combinare letture o scritture più piccole in un numero inferiore di letture / scritture, o leggere o scrivere in un ordine diverso. I registri di un dispositivo hanno quasi sempre degli effetti collaterali e quindi spesso non possono essere trattati come i chip RAM.
But can you send data to the printer by directly manipulating the pins
of the parallel port, that is, does the CPU have some instruction like
this:
Iniziamo assumendo che la CPU abbia uno spazio di indirizzo fisico e che lo spazio di indirizzamento fisico sia 4 GiB e che ogni indirizzo fisico sia un indirizzo a 32 bit.
Supponiamo che 2 Gb dello spazio di indirizzamento fisico (indirizzi da 0x00000000 a 0x7FFFFFFF) sia usato per la RAM, e che per le letture e le scritture in quell'area la CPU faccia trucchi per migliorare le prestazioni (memorizzazione nella cache, ecc.)
Supponiamo anche che i restanti 2 GiB dello spazio di indirizzamento fisico (indirizzi da 0x80000000 a 0xFFFFFFFF) possano essere usati per vari dispositivi (e che la CPU non faccia trucchi per leggere e scrivere in quest'area).
Infine; supponiamo che la CPU abbia istruzioni che leggono o scrivono su qualsiasi indirizzo. La stessa istruzione che legge (ad es.) Una variabile nella propria applicazione (con un indirizzo) può essere utilizzata per leggere (ad es. Un registro di un controller di porta parallela (a un indirizzo diverso).
In questo caso non è necessario che la CPU abbia istruzioni speciali per i dispositivi.
Tuttavia ...
Per alcune CPU ci sono più spazi di indirizzi. Ad esempio, per 80x86 c'è lo spazio dell'indirizzo fisico (come quello che ho descritto sopra), ma esiste anche uno "spazio di indirizzamento della porta IO". In questo caso la CPU avrebbe alcune istruzioni speciali che sono utilizzate per accedere allo spazio di indirizzamento speciale (ad esempio in
e out
istruzioni per accedere allo "spazio di indirizzamento della porta IO") e queste istruzioni speciali potrebbero avere un comportamento diverso rispetto alle normali istruzioni che leggono o scrivono nello spazio di indirizzamento fisico (ad esempio potrebbero bypassare la MMU o implicare controlli di autorizzazione completamente diversi).