Muistikartoitettu I / O - Memory-mapped I/O

Muisti-yhdistetty I / O ( MMIO ) ja portti-yhdistetty I / O ( PMIO ) ovat toisiaan täydentäviä menetelmiä suorittamiseksi tulo / lähtö (I / O) välistä keskusyksikkö (CPU) ja oheislaitteet on tietokone . Toisena vaihtoehtona on käyttää omistettu I / O-prosessorit, joka tunnetaan yleisesti nimellä kanavat päälle suurkoneliiketoiminta , jotka toteuttavat omia ohjeita .

Muisti-yhdistetty I / O-käyttää samaa osoitetta tilaa käsitellä sekä muistin ja I / O-laitteita . I / O-laitteiden muisti ja rekisterit kartoitetaan (liitetään) osoitearvoihin. Joten muistiosoite voi viitata joko osaan fyysistä RAM-muistia tai sen sijaan I / O-laitteen muistiin. Siten muistin käyttämiseen käytettyjä CPU-käskyjä voidaan käyttää myös laitteiden käyttämiseen. Kukin I / O-laite valvoo suorittimen osoiteväylää ja reagoi laitteelle osoitetun osoitteen mahdolliseen CPU-yhteyteen yhdistämällä tietoväylän halutun laitteen laitteistorekisteriin . I / O-laitteiden sijoittamiseksi CPU: n käyttämien osoitteiden alueet on varattava I / O: lle, eivätkä ne saa olla käytettävissä normaalissa fyysisessä muistissa. Varaus voi olla pysyvä tai väliaikainen ( pankkisiirron avulla saavutettu ). Esimerkki jälkimmäisestä löytyy Commodore 64: stä , joka käyttää muistikartoituksen muotoa aiheuttaakseen RAM- tai I / O-laitteiston esiintymisen 0xD000-0xDFFFalueella.

Porttikartoitettu I / O käyttää usein erityistä CPU-käskyjen luokkaa, jotka on suunniteltu erityisesti I / O: n suorittamiseen, kuten x86- ja x86-64- arkkitehtuureihin perustuvia mikroprosessoreista löytyviä ohjeita inja outohjeita . Eri muodot näiden kahden ohjeet voivat kopioida yhden, kaksi tai neljä tavua ( , ja , vastaavasti) välillä EAX- rekisteriin tai yksi tämän rekisterin n osa-alueilla CPU ja tietyn I / O-portti, johon on liitetty I / O-laitteeseen. I / O-laitteilla on erillinen osoitetila yleisestä muistista, joko suorittamalla ylimääräinen "I / O" -tappi CPU: n fyysisessä rajapinnassa tai koko väylä, joka on omistettu I / O: lle. Koska I / O: n osoiteavaruus on eristetty päämuistin osoitteesta, tätä kutsutaan joskus eristetyksi I / O: ksi. outboutwoutl

Yleiskatsaus

Erilaiset suorittimen ja laitteen väliset tiedonsiirtomenetelmät, kuten muistikartoitus, eivät vaikuta laitteen suoraan muistipääsyyn (DMA), koska määritelmän mukaan DMA on muistista laitteeseen -välitysmenetelmä, joka ohittaa suorittimen.

Laitteiden keskeytykset ovat toinen tiedonsiirtomenetelmä suorittimen ja oheislaitteiden välillä, mutta keskeytyksiä käsitellään useista syistä aina erikseen. Keskeytys käynnistetään laitteella, toisin kuin edellä mainitut menetelmät, jotka ovat prosessorin käynnistämiä. Se on myös yksisuuntainen, koska tieto kulkee vain laitteesta keskusyksikköön. Lopuksi, jokainen keskeytyslinja kuljettaa vain yhden bitin tietoa, jolla on kiinteä merkitys, nimittäin "huomiota vaativa tapahtuma on tapahtunut tämän keskeytyslinjan laitteessa".

I / O-toiminnot voivat hidastaa muistin käyttöä, jos osoite ja tietoväylät jaetaan. Tämä johtuu siitä, että oheislaite on yleensä paljon hitaampi kuin päämuisti. Joissakin arkkitehtuureissa porttikartoitettu I / O toimii erityisen I / O-väylän kautta ongelman lievittämiseksi.

Yksi muistikartoitettujen I / O: n ansio on, että hylkäämällä portti I / O: n tuoman ylimääräisen monimutkaisuuden CPU vaatii vähemmän sisäistä logiikkaa ja on siten halvempi, nopeampi, helpompi rakentaa, kuluttaa vähemmän virtaa ja voi olla fyysisesti pienempi; tämä noudattaa supistetun käskyjoukon laskennan perusperiaatteita ja on edullista myös sulautetuissa järjestelmissä . Toinen etu on, että koska laitteiden osoittamiseen käytetään tavallisia muistikäskyjä, kaikki keskusyksikön osoitetilat ovat käytettävissä I / O: lle sekä muistille ja ohjeille, jotka suorittavat ALU- operaation suoraan muistoperandille ( operandia muistipaikasta, tuloksen tallentamista muistipaikkaan tai molempia) voidaan käyttää myös I / O-laiterekistereiden kanssa. Sitä vastoin porttikartoitetut I / O-ohjeet ovat usein hyvin rajoitettuja, ja ne tarjoavat usein vain yksinkertaisia ​​lataus- ja tallennusoperaatioita suorittimen rekisterien ja I / O-porttien välillä, jotta esimerkiksi vakio lisätään porttikartoitettuihin laiterekisteri vaatii kolme ohjeita: lue portti CPU-rekisteriin, lisää vakio CPU-rekisteriin ja kirjoita tulos takaisin porttiin.

Koska 16-bittiset prosessorit ovat vanhentuneet ja korvattu 32- ja 64-bittisillä yleiskäytössä, muistiosoitealueiden varaaminen I / O: lle on vähemmän ongelma, koska prosessorin muistiosoitetila on yleensä paljon suurempi kuin vaadittu tila kaikille järjestelmän muistille ja I / O-laitteille. Siksi on tullut yhä käytännöllisemmäksi hyödyntää muistikartoitetun I / O: n etuja. Vaikka osoiteavaruus ei enää olisikaan merkittävä huolenaihe, kumpikaan I / O-kartoitusmenetelmä ei ole yleisesti parempi kuin toinen, ja on tapauksia, joissa porttikartoitetun I / O: n käyttö on edelleen edullista.

Muistikartoitettu I / O on suositeltava x86- pohjaisissa arkkitehtuureissa, koska porttipohjaisen I / O: n suorittavat ohjeet on rajoitettu yhteen rekisteriin: EAX, AX ja AL ovat ainoat rekisterit, joihin tietoja voidaan siirtää tai joista voidaan siirtää, ja joko tavun kokoinen välitön arvo käskyssä tai arvo rekisterissä DX määrittää, mikä portti on siirron lähde- tai kohdeportti. Koska mikä tahansa yleiskäyttöinen rekisteri voi lähettää tai vastaanottaa tietoja muistiin tai muistista ja muistikartoitetuista I / O-laitteista tai muistista, muistikartoitettu I / O käyttää vähemmän ohjeita ja voi toimia nopeammin kuin portti I / O. AMD ei laajentanut portin I / O-ohjeita määritellessään x86-64 -arkkitehtuuria tukemaan 64-bittisiä portteja, joten 64-bittisiä siirtoja ei voida suorittaa portti I / O: lla.

Muistin esteet

Koska välimuistit välittävät pääsyn muistiosoitteisiin, eri osoitteisiin kirjoitettu data voi päästä oheislaitteiden muistiin tai rekisteröityä pois ohjelmajärjestyksestä, ts. Jos ohjelmisto kirjoittaa tietoja osoitteeseen ja sitten tietoja toiseen osoitteeseen, välimuistin kirjoituspuskuri ei taata, että tiedot saapuvat oheislaitteisiin siinä järjestyksessä. Jokainen ohjelma, joka ei sisällä välimuistin huuhteluohjeita jokaisen sarjan kirjoittamisen jälkeen, saattaa nähdä tahattomat IO-vaikutukset, jos välimuistijärjestelmä optimoi kirjoitusjärjestyksen. Kirjoitukset muistiin voidaan usein järjestää redundanssin vähentämiseksi tai muistin käyttöjaksojen paremman hyödyntämiseksi muuttamatta tallennetun sisällön lopullista tilaa; kun taas samat optimoinnit saattavat muuttaa täysin muistiin kartoitettujen I / O-alueiden kirjoitusten merkityksen ja vaikutuksen.

Ennakoinnin puute muistikartoitettujen I / O-alueiden valinnassa johti monien vanhempien sukupolvien tietokoneiden ram-kapasiteetin esteisiin. Suunnittelijat harvoin odottivat koneiden kasvavan hyödyntämään arkkitehtuurin teoreettista RAM-kapasiteettia täysimääräisesti, ja käyttivät siis usein joitain osoiteavaruuden korkeammasta bitistä muistikartoitettujen I / O-toimintojen valitsimina. Esimerkiksi 640 kt: n este IBM PC: ssä ja johdannaisissa johtuu alueen varaamisesta 640–1024 kt (64 kt: n segmentit 10–16) ylemmälle muistialueelle . Alun perin tällä valinnalla ei ollut juurikaan vaikutusta, mutta se lopulta rajoitti käytettävissä olevan 20-bittisen osoiteavaruuden kokonaismuistia. 3 GB este ja PCI-aukko ovat samanlaiset ilmenemismuotoja tämän 32-bittisen osoiteavaruuden, pahentaa yksityiskohtia X86 käynnistyksen ja MMU suunnittelu. 64-bittisillä arkkitehtuureilla on usein teknisesti samanlaisia ​​asioita, mutta niillä on vain harvoin käytännön seurauksia.

Esimerkkejä

Esimerkki järjestelmän muistikartasta
Osoitealue ( heksadesimaali ) Koko Laite
0000–7FFF 32 KiB RAM
8000–80FF 256 tavua Yleiskäyttöinen I / O
9000–90FF 256 tavua Ääniohjain
A000 – A7FF 2 KiB Video-ohjaimen / tekstikartoitetun näytön RAM
C000 – FFFF 16 KiB ROM

Yksinkertainen järjestelmä, joka on rakennettu 8-bittisen mikroprosessorin ympärille, saattaa tarjota 16-bittisiä osoiteriviä, jolloin se voi kohdistaa jopa 64  kibatavua (KiB) muistia. Tällaisessa järjestelmässä ensimmäiset 32 ​​KiB: n osoitetila voidaan kohdistaa hajasaantimuistiin (RAM), toinen 16 KiB vain luku -muistiin (ROM) ja loput useille muille laitteille, kuten ajastimille, laskureille, videonäytölle sirut, ääntä tuottavat laitteet jne.

Järjestelmän laitteisto on järjestetty siten, että osoiteväylän laitteet vastaavat vain tiettyihin osoitteisiin, jotka on tarkoitettu heille, kun taas kaikki muut osoitteet jätetään huomiotta. Tämä on osoitteen dekoodauspiirin tehtävä , ja se muodostaa järjestelmän muistikartan . Tämän seurauksena järjestelmän muistikartta voi näyttää oikealta olevasta taulukosta. Tämä muistikartta sisältää aukkoja, mikä on myös melko yleistä todellisissa järjestelmäarkkitehtuureissa.

Olettaen, että näytönohjaimen neljäs rekisteri asettaa näytön taustavärin, keskusyksikkö voi asettaa tämän värin kirjoittamalla arvon muistipaikkaan A003 käyttämällä tavallista muistin kirjoitusohjetta. Samaa menetelmää käyttämällä kaaviot voidaan näyttää ruudulla kirjoittamalla merkkiarvot erityiselle RAM-alueelle video-ohjaimessa. Ennen halpaa RAM-muistia, joka mahdollisti bittikartoitetut näytöt , tämä merkkisolumenetelmä oli suosittu tekniikka tietokoneen videonäytöille (katso Tekstin käyttöliittymä ).

Osoitekoodauksen perustyypit

Osoitekoodaustyypit, joissa laite voi purkaa osoitteet kokonaan tai puutteellisesti, sisältävät seuraavat:

Täydellinen (tyhjentävä) dekoodaus
1: 1 yksilöllisten osoitteiden kartoitus yhteen laitteistorekisteriin (fyysisen muistin sijainti). Mukana tarkistaa osoiteväylän jokaisen rivin .
Puutteellinen (osittainen) dekoodaus
n: 1 yksilöllisen osoitteen kartoitus yhteen laitteistorekisteriin. Osittainen dekoodaus sallii muistipaikalla olla useampi kuin yksi osoite, jolloin ohjelmoija voi viitata muistipaikkaan käyttämällä n eri osoitetta. Voidaan myös yksinkertaistaa dekoodauslaitteistoa käyttämällä yksinkertaisempaa ja usein halvempaa logiikkaa, joka tutkii vain joitain osoiterivejä, kun prosessorin kaikkia osoitetiloja ei tarvita. Yleensä dekoodaus itsessään on ohjelmoitavissa, joten järjestelmä voi konfiguroida oman muistikarttansa uudelleen tarpeen mukaan, vaikka tämä on uudempi kehitys ja yleensä ristiriidassa halutustavoitteen kanssa.
Synonyymit: taitettava, moninkertaistettu, osittain kartoitettu, osoitteen alias .
Lineaarinen dekoodaus
Osoiterivejä käytetään suoraan ilman dekoodauslogiikkaa. Tämä tehdään laitteilla, kuten RAM-muistit ja ROM-levyt, joilla on jakso osoitesyötteitä, ja oheislaitteiden siruilla, joilla on samanlainen syötesarja rekisteripankin osoittamiseksi. Lineaarista osoitetta käytetään harvoin yksin (vain silloin, kun väylässä on vähän laitteita, koska puhtaasti lineaarisen osoitteen käyttäminen useammalle kuin yhdelle laitteelle tuhlaa yleensä paljon osoitetilaa), mutta yhdistetään sen sijaan johonkin muuhun menetelmään laitteen valitsemiseksi tai laiteryhmä, jonka lineaarinen osoite osoittaa yhden rekisterin tai muistipaikan.

Port I / O -laiteohjainten kautta

Windows-pohjaisissa tietokoneissa muistiin pääsee myös tietyillä ohjaimilla, kuten DOLLx8KD, joka antaa I / O-pääsyn 8-, 16- ja 32-bittisenä useimmilla Windows-alustoilla alkaen Windows 95: stä Windows 7: een. I / O: n asentaminen porttiohjaimet varmistavat muistin käytön aktivoimalla ohjaimet yksinkertaisilla DLL-puheluilla, jotka mahdollistavat portin I / O: n, ja kun sitä ei tarvita, ohjain voidaan sulkea luvattoman pääsyn estämiseksi I / O-portteihin.

Linux tarjoaa pcimem- apuohjelman, jonka avulla voidaan lukea ja kirjoittaa MMIO-osoitteista. Linux-ydin sallii myös MMIO-pääsyn jäljittämisen ytimen moduuleista (ohjaimet) ytimen mmiotrace- virheenkorjaustoiminnon avulla. Tämän mahdollistamiseksi Linux-ydin tulisi kääntää vastaavan vaihtoehdon ollessa käytössä. mmiotrace-sovellusta käytetään suljettujen lähdekoodien laiteohjainten virheenkorjaukseen.

Katso myös

Viitteet