Memória által leképezett I / O - Memory-mapped I/O

A memória-leképezett I / O ( MMIO ) és a port-leképezett I / O ( PMIO ) két kiegészítő módszer a bemenet / kimenet (I / O) végrehajtására a központi processzor (CPU) és a perifériás eszközök között egy számítógépen . Alternatív megközelítés a dedikált I / O processzorok, közismert nevén a nagyszámítógépek csatornáinak használata , amelyek saját utasításokat hajtanak végre .

Memórialeképezésesek I / O ugyanazt a címtartomány -nak mindkét memória és I / O eszközök . Az I / O eszközök memóriája és regiszterei a címértékekhez vannak társítva (társítva). Tehát egy memóriacím utalhat a fizikai RAM egy részére , vagy ehelyett az I / O eszköz memóriájára. Így a memória eléréséhez használt CPU utasítások az eszközök elérésére is felhasználhatók. Minden I / O eszköz figyeli a CPU címsínjét, és reagál az adott eszközhöz rendelt cím bármilyen CPU-hozzáférésére, összekapcsolva az adatbuszt a kívánt eszköz hardverregiszterével . Az I / O eszközök befogadásához a CPU által használt címek területeit az I / O számára kell fenntartani, és nem lehet elérhető a normál fizikai memória számára. A foglalás lehet állandó vagy ideiglenes (a bankváltás révén érhető el ). Utóbbira példa található a Commodore 64-ben , amely a memória leképezésének egyik formáját alkalmazza a RAM vagy I / O hardver megjelenésére a 0xD000-0xDFFFtartományban.

A porttal leképezett I / O gyakran a CPU utasítások speciális osztályát használja, amelyet kifejezetten az I / O végrehajtására terveztek, például a mikroprocesszorokon található utasításokat inés oututasításokat az x86 és x86-64 architektúrák alapján. Különböző formájú a két utasítás lehet másolni egy, kettő vagy négy bájt ( outb, outwés outlrendre) között EAX regiszter vagy egy adott regiszter alegységeinek a CPU és a megadott I / O port, amely hozzá van rendelve egy I / O eszköz. Az I / O eszközöknek külön címterük van az általános memóriától, vagy a CPU fizikai interfészén található extra "I / O" tűvel, vagy az I / O-nak szentelt teljes busszal . Mivel az I / O címtere el van különítve a fő memóriától, ezt néha izolált I / O-nak nevezik.

Áttekintés

A különböző CPU-készülék közötti kommunikációs módszerek, például a memória leképezése, nem befolyásolják az eszköz közvetlen memória-hozzáférését (DMA), mert definíció szerint a DMA memória-eszköz kommunikációs módszer, amely megkerüli a CPU-t.

A hardveres megszakítások egy másik kommunikációs módszer a CPU és a perifériás eszközök között, azonban számos okból a megszakításokat mindig külön kezelik. A megszakítás eszköz által indított, szemben a fent említett módszerekkel, amelyek a processzor által indítottak. Ez egyirányú is, mivel az információ csak eszközről áramlik a CPU-ra. Végül valamennyi interrupt hordoz csak egy kicsit az információt egy meghatározott jelentés, azaz „olyan esemény, amely figyelmet igényel történt egy eszköz ebben a megszakítási vonalat”.

Az I / O műveletek lassíthatják a memória elérését, ha a cím és az adat buszok megosztottak. Ennek oka, hogy a periféria általában sokkal lassabb, mint a fő memória. Egyes architektúrákban a porttal leképezett I / O egy dedikált I / O buszon keresztül működik, enyhítve a problémát.

A memória által leképezett I / O egyik érdeme, hogy elvetve azt a bonyolultságot, amelyet az I / O port jelent, a CPU kevesebb belső logikát igényel, és így olcsóbb, gyorsabb, könnyebben felépíthető, kevesebb energiát fogyaszt és fizikailag is kisebb lehet; ez követi a csökkentett utasításkészlet-számítás alaptételeit , és előnyös a beágyazott rendszerekben is . A másik előny az, hogy mivel az eszközök címzéséhez rendszeres memóriautasításokat használnak, a CPU összes címzési módja rendelkezésre áll az I / O, valamint a memória és az utasítások számára, amelyek ALU műveletet hajtanak végre közvetlenül a memória operanduson (egy operandus memóriahelyről, az eredmény tárolása memóriahelyre, vagy mindkettő) használható az I / O eszközregiszterekkel is. Ezzel szemben a porttal leképezett I / O utasítások gyakran nagyon korlátozottak, gyakran csak egyszerű betöltés és tárolás műveleteket biztosítanak a CPU regiszterek és az I / O portok között, így például egy konstans hozzáadása egy port-leképezéshez az eszközregiszterhez három utasításra lenne szükség: olvassa el a portot egy CPU regiszterhez, adja hozzá az állandót a CPU regiszterhez, és írja le az eredményt a portra.

Mivel a 16 bites processzorok elavultak és általános használatban 32 bites és 64 bitesek lettek , a memóriacím-tartományok I / O számára történő lefoglalása kisebb problémát jelent, mivel a processzor memóriacím-területe általában sokkal nagyobb mint a rendszer összes memóriájához és I / O eszközéhez szükséges hely. Ezért egyre gyakoribbá vált a memória által leképezett I / O előnyeinek kihasználása. Még akkor is, ha a címtér már nem jelent nagyobb problémát, egyik I / O leképezési módszer sem univerzálisan jobb a másiknál, és lesznek esetek, amikor a porttal leképezett I / O használata továbbra is előnyösebb.

A memória által leképezett I / O előnyös az x86 alapú architektúrákban, mivel a port alapú I / O műveleteket végrehajtó utasítások csak egy regiszterre korlátozódnak: az EAX, AX és AL az egyetlen regiszter, ahová az adatok áthelyezhetők, vagy egy bájt méretű azonnali érték az utasításban, vagy egy érték a DX regiszterben határozza meg, hogy melyik port az átviteli forrás vagy cél port. Mivel bármely általános célú regisztráció képes adatokat küldeni vagy fogadni a memóriából és a memóriából, illetve a memóriához leképezett I / O eszközökről, memóriából leképezett I / O kevesebb utasítást használ, és gyorsabban futtatható, mint a port I / O. Az AMD nem terjesztette ki a port I / O utasításait az x86-64 architektúra definiálásakor, hogy támogassa a 64 bites portokat, ezért a 64 bites átvitelt nem lehet I / O port használatával végrehajtani.

Memória korlátok

Mivel a gyorsítótárak közvetítik a hozzáférést a memória címekhez, a különböző címekre írt adatok elérhetik a perifériák memóriáját, vagy a program sorrendjéből ki tudnak regisztrálódni, azaz ha a szoftver adatokat ír egy címre, majd adatokat ír egy másik címre, akkor a gyorsítótár- írási puffer nem garantáljuk, hogy az adatok ebben a sorrendben eljutnak a perifériákhoz. Bármely program, amely nem tartalmaz gyorsítótár-öblítési utasításokat a sorozat minden egyes írása után, nem szándékos IO-effektusokat láthat, ha a gyorsítótár-rendszer optimalizálja az írási sorrendet. A memóriába írt írások gyakran átrendezhetők a redundancia csökkentése vagy a memóriaelérési ciklusok jobb kihasználása érdekében, anélkül, hogy megváltoztatnák a tárolt adatok végső állapotát; mivel ugyanazok az optimalizálások teljesen megváltoztathatják a memória által leképezett I / O régiókba írások jelentését és hatását.

Az előrelátás hiánya a memória által leképezett I / O régiók megválasztásában a számítógépek idősebb generációinak sok ram-kapacitás-korlátjához vezetett. A tervezők ritkán számítottak arra, hogy a gépek növekedni fognak, hogy teljes mértékben kihasználják az építészet elméleti RAM-kapacitását, és ezért gyakran használták a cím-tér magas rendű bitjeit a memória által leképezett I / O-funkciók választóiként. Például az 640 KB korlát az IBM PC-ben és a származékaiban annak tudható be, hogy a 640 és 1024 KB közötti tartományt (64k 10-16 szegmens) lefoglalja a felső memória terület számára . Ez a választás kezdetben csekély hatást gyakorolt, de végül korlátozta a rendelkezésre álló teljes ramot a 20 bites elérhető címtérben. A 3 GB-os korlát és a PCI-lyuk ennek hasonló megnyilvánulása a 32 bites címterekkel, amit az X86-os rendszerindítási folyamat és az MMU- tervezés részletei súlyosbítanak . A 64 bites architektúráknak technikailag gyakran vannak hasonló problémáik, de ezeknek csak ritkán vannak gyakorlati következményei.

Példák

Minta a rendszer memória térképéről
Címtartomány ( hexadecimális ) Méret Eszköz
0000–7FFF 32 KiB RAM
8000–80FF 256 bájt Általános célú I / O
9000–90FF 256 bájt Hangvezérlő
A000 – A7FF 2 KiB Videovezérlő / szöveg-leképezett kijelző RAM
C000 – FFFF 16 KiB ROM

Egy 8 bites mikroprocesszor köré épített egyszerű rendszer 16 bites címsorokat biztosíthat, amelyek akár 64  kibibájt (KiB) memóriát képesek címezni . Egy ilyen rendszeren az első 32 KiB címteret el lehet rendelni a véletlen hozzáférésű memóriához (RAM), egy másik 16 KiB-t a csak olvasható memóriához (ROM), a fennmaradó részt pedig számos más eszközhöz, például időzítőkhöz, számlálókhoz, videokijelzőhöz chipek, hangkeltő eszközök stb.

A rendszer hardvere úgy van elrendezve, hogy a címsínen lévő eszközök csak bizonyos, számukra szánt címekre reagálnak, miközben az összes többi címet figyelmen kívül hagyják. Ez a címdekódoló áramkör feladata , és ez létrehozza a rendszer memóriatérképét . Ennek eredményeként a rendszer memóriatérképe úgy nézhet ki, mint a jobb oldali táblázatban. Ez a memóriatérkép réseket tartalmaz, ami a tényleges rendszerarchitektúrákban is meglehetősen gyakori.

Feltételezve, hogy a videovezérlő negyedik regisztere állítja be a képernyő háttérszínét, a CPU beállíthatja ezt a színt úgy, hogy értéket ír az A003 memóriahelyre a szokásos memóriaírási utasítás segítségével. Ugyanezzel a módszerrel grafikonok jeleníthetők meg a képernyőn úgy, hogy karakterértékeket írnak be a RAM egy speciális területére a videó vezérlőn belül. A bittérképes megjelenítést lehetővé tevő olcsó RAM előtt ez a karaktercellás módszer népszerű technika volt a számítógépes videokijelzők számára (lásd: Szöveges felhasználói felület ).

A cím dekódolásának alapvető típusai

A címdekódolási típusok, amelyekben egy eszköz teljesen vagy hiányosan dekódolhatja a címeket, a következőket tartalmazzák:

Teljes (teljes) dekódolás
1: 1 egyedi címek leképezése egy hardverregiszterbe (fizikai memória helye). Ellenőrzését foglalja magában, minden sorban a cím busz .
Hiányos (részleges) dekódolás
n: n egyedi cím 1 hozzárendelése egy hardver regiszterhez. A részleges dekódolás lehetővé teszi, hogy egy memóriahelynek több címe legyen, lehetővé téve a programozó számára, hogy n különböző cím használatával hivatkozhasson a memória helyére. Meg lehet tenni a dekódoló hardver egyszerűsítését is egyszerűbb és gyakran olcsóbb logika alkalmazásával, amely csak néhány címsort vizsgál meg, amikor nincs szükség a CPU teljes címterére. Általában maga a dekódolás programozható, így a rendszer szükség szerint átkonfigurálhatja saját memóriatérképét, bár ez egy újabb fejlesztés, és általában ellentétes azzal a szándékkal, hogy olcsóbb legyen.
Szinonimák: hajtogatás, szorzattérkép, részlegesen feltérképezve, cím aliasing .
Lineáris dekódolás
A címsorokat dekódolási logika nélkül közvetlenül használják. Ez olyan eszközökkel történik, mint például RAM-ok és ROM-ok, amelyek sorrendben tartalmazzák a címbemeneteket, és olyan perifériás chipekkel, amelyek hasonló bemenetsorral rendelkeznek a nyilvántartások bankjának címzéséhez. A lineáris címzést ritkán alkalmazzák egyedül (csak akkor, ha kevés eszköz van a buszon, mivel a tisztán lineáris címzés egynél több eszközre általában sok címterületet pazarol el), ehelyett azonban egy másik módszer egyikével kombinálva választanak ki egy eszközt, vagy eszközcsoport, amelyen belül a lineáris címzés egyetlen regisztert vagy memóriahelyet választ.

Port I / O eszközillesztőkön keresztül

Windows-alapú számítógépeken a memória meghatározott illesztőprogramokon keresztül is elérhető, például a DOLLx8KD, amely 8, 16 és 32 bites hozzáférést biztosít az I / O-hoz a legtöbb Windows-platformon, a Windows 95-től a Windows 7-ig kezdődően. a portillesztők biztosítják a memória elérését az illesztőprogramok egyszerű DLL-hívásokkal történő aktiválásával, amely lehetővé teszi a port I / O-t, és ha nincs rá szükség, az illesztőprogram bezárható, hogy megakadályozza az I / O-portokhoz való illetéktelen hozzáférést.

A Linux biztosítja a pcimem segédprogramot, amely lehetővé teszi az MMIO-címekről történő olvasást és írást. A Linux kernel lehetővé teszi az MMIO hozzáférés nyomon követését a kernelmodulokról (illesztőprogramokról) is a kernel mmiotrace hibakeresési lehetőségével. Ennek engedélyezéséhez a Linux kernelt le kell fordítani a megfelelő opció engedélyezésével. Az mmiotrace a zárt forrású eszközillesztők hibakeresésére szolgál.

Lásd még

Hivatkozások