# E/S assignades a memòria i E/S assignades a ports

Les E/S assignades amb memòria (MMIO) i les E/S assignades per ports (PMIO) són dos mètodes complementaris per realitzar entrada/sortida (E/S) entre la unitat central de processament (CPU) i els dispositius perifèrics d'un ordinador (sovint mediant). accés mitjançant chipset). Un enfocament alternatiu és utilitzar processadors d'E/S dedicats, comunament coneguts com a canals en ordinadors mainframe, que executen les seves pròpies instruccions.
L'E/S assignada a la memòria utilitza el mateix espai d'adreces per adreçar tant la memòria principal com els dispositius d'E/S. La memòria i els registres dels dispositius d'E/S s'assignen a (associats amb) valors d'adreça, de manera que una adreça de memòria pot referir-se a una part de la RAM física o a la memòria i els registres del dispositiu d'E/S. Així, les instruccions de la CPU utilitzades per accedir a la memòria (p. ex. MOV ...) també es poden utilitzar per accedir als dispositius. Cada dispositiu d'E/S supervisa el bus d'adreces de la CPU i respon a qualsevol accés de la CPU d'una adreça assignada a aquest dispositiu, connectant el bus del sistema al registre de maquinari del dispositiu desitjat o utilitza un dispositiu dedicat.
Per acomodar els dispositius d'E/S, algunes àrees del bus d'adreces utilitzades per la CPU s'han de reservar per a E/S i no han d'estar disponibles per a la memòria física normal; el rang d'adreces utilitzades per als dispositius d'E/S ve determinat pel maquinari. La reserva pot ser permanent o temporal (tal com s'aconsegueix mitjançant canvi de banc). Un exemple d'això últim es troba al Commodore 64, que utilitza una forma de mapeig de memòria per fer que la memòria RAM o el maquinari d'E/S apareguin a l'interval 0xD000-0xDFFF.
L'E/S de mapa de ports utilitza sovint una classe especial d'instruccions de CPU dissenyades específicament per realitzar E/S, com ara les instruccions in i out que es troben als microprocessadors basats en l'arquitectura x86. Diferents formes d'aquestes dues instruccions poden copiar un, dos o quatre bytes (outb, outw i outl, respectivament) entre el registre EAX o una de les subdivisions d'aquest registre a la CPU i una adreça de port d'E/S especificada que s'assigna a un dispositiu d'E/S. Els dispositius d'E/S tenen un espai d'adreces separat de la memòria general, ja sigui mitjançant un pin "I/O" addicional a la interfície física de la CPU o un bus complet dedicat a l'E/S. Com que l'espai d'adreces per a E/S està aïllat del de la memòria principal, això de vegades s'anomena E/S aïllada.

## Visió general

Els diferents mètodes de comunicació de CPU a dispositiu, com ara l'assignació de memòria, no afecten l'accés directe a la memòria (DMA) d'un dispositiu, perquè, per definició, DMA és un mètode de comunicació de memòria a dispositiu que evita la CPU.
Les interrupcions de maquinari són un altre mètode de comunicació entre la CPU i els dispositius perifèrics, però, per diversos motius, les interrupcions sempre es tracten per separat. Una interrupció s'inicia pel dispositiu, a diferència dels mètodes esmentats anteriorment, que s'inicien per la CPU. També és unidireccional, ja que la informació només flueix del dispositiu a la CPU. Finalment, cada línia d'interrupció només porta un bit d'informació amb un significat fix, és a dir, "s'ha produït un esdeveniment que requereix atenció en un dispositiu d'aquesta línia d'interrupció".

## Tipus bàsics de descodificació d'adreces

Els tipus de descodificació d'adreces, en què un dispositiu pot descodificar adreces completament o incompletament, inclouen els següents:

### Descodificació completa (exhaustiva)

    Mapeig 1:1 d'adreces úniques a un registre de maquinari (ubicació de memòria física). Implica comprovar totes les línies del bus d'adreces.

### Descodificació incompleta (parcial)

    n:1 mapatge de n adreces úniques a un registre de maquinari. La descodificació parcial permet que una ubicació de memòria tingui més d'una adreça, permetent al programador fer referència a una ubicació de memòria utilitzant n adreces diferents. També es pot fer per simplificar el maquinari de descodificació utilitzant una lògica més senzilla i sovint més barata que examina només algunes línies d'adreces, quan no es necessita tot l'espai d'adreces de la CPU. Normalment, la descodificació en si és programable, de manera que el sistema pot reconfigurar el seu propi mapa de memòria segons sigui necessari, tot i que es tracta d'un desenvolupament més recent i, generalment, entra en conflicte amb la intenció de ser més barat.
    Sinònims: foldback, multiplicar mapejat, parcialment mapejat, àlies d'adreça.

### Descodificació lineal

    Les línies d'adreces s'utilitzen directament sense cap lògica de descodificació. Això es fa amb dispositius com ara RAM i ROM que tenen una seqüència d'entrades d'adreces, i amb xips perifèrics que tenen una seqüència similar d'entrades per adreçar un banc de registres. L'adreçament lineal rarament s'utilitza sol (només quan hi ha pocs dispositius al bus, ja que l'ús d'adreçament purament lineal per a més d'un dispositiu sol malgastar molt espai d'adreces), sinó que es combina amb un dels altres mètodes per seleccionar un dispositiu o grup de dispositius dins dels quals l'adreçament lineal selecciona un sol registre o ubicació de memòria.

## Port I/O mitjançant controladors de dispositiu

En ordinadors basats en Windows, també es pot accedir a la memòria mitjançant controladors específics, com ara DOLLx8KD, que ofereix accés a E/S en 8, 16 i 32 bits a la majoria de plataformes Windows a partir de Windows 95 fins a Windows 7. La instal·lació de controladors de port d'E/S garantirà l'accés a la memòria activant els controladors amb simples trucades DLL que permeten l'E/S del port i, quan no sigui necessari, el controlador es pot tancar per evitar l'accés no autoritzat als ports d'E/S.
Linux proporciona elpcimem utilitat per permetre llegir i escriure a adreces MMIO. El nucli de Linux també permet rastrejar l'accés MMIO des dels mòduls del nucli (controladors) mitjançant la funció de depuració mmiotrace del nucli. Per habilitar-ho, el nucli Linux s'ha de compilar amb l'opció corresponent habilitada. mmiotrace s'utilitza per depurar controladors de dispositiu de codi tancat.

## Port I/O mitjançant controladors de dispositiu

En ordinadors basats en Windows, també es pot accedir a la memòria mitjançant controladors específics, com ara DOLLx8KD, que ofereix accés a E/S en 8, 16 i 32 bits a la majoria de plataformes Windows a partir de Windows 95 fins a Windows 7. La instal·lació de controladors de port d'E/S garantirà l'accés a la memòria activant els controladors amb simples trucades DLL que permeten l'E/S del port i, quan no sigui necessari, el controlador es pot tancar per evitar l'accés no autoritzat als ports d'E/S.
Linux proporciona elpcimem utilitat per permetre llegir i escriure a adreces MMIO. El nucli de Linux també permet rastrejar l'accés MMIO des dels mòduls del nucli (controladors) mitjançant la funció de depuració mmiotrace del nucli. Per habilitar-ho, el nucli Linux s'ha de compilar amb l'opció corresponent habilitada. mmiotrace s'utilitza per depurar controladors de dispositiu de codi tancat.

## Referències

* ↑ «Difference between port mapped and memory mapped access?» (en anglès). [Consulta: 17 setembre 2023].
* ↑ «How does port mapped I/O and I/O mapped I/O work» (en anglès). [Consulta: 17 setembre 2023].
* ↑ «Memory mapped I/O and Isolated I/O» (en anglès americà), 08-06-2018. [Consulta: 17 setembre 2023].
* ↑ Dandamudi, Sivarama P. «Chapter 19 Input/Output Organization». A: Fundamentals of Computer Organization and Design (en anglès). Springer Science+Business Media. ISBN 978-0-387-21566-2.