Paměťově mapované I / O - Memory-mapped I/O

Paměťově mapované I / O ( MMIO ) a portově mapované I / O ( PMIO ) jsou dvě doplňkové metody provádění vstupu / výstupu (I / O) mezi centrální procesorovou jednotkou (CPU) a periferními zařízeními v počítači . Alternativním přístupem je použití vyhrazených I / O procesorů, běžně známých jako kanály na sálových počítačích , které provádějí své vlastní pokyny .

Paměťově mapované I / O používá stejný adresový prostor k adresování paměti i I / O zařízení . Paměť a registry I / O zařízení jsou mapovány na (přidružené) hodnoty adres. Takže adresa paměti může odkazovat buď na část fyzické RAM , nebo místo toho na paměť I / O zařízení. Pokyny CPU použité k přístupu do paměti lze tedy také použít pro přístup k zařízením. Každé I / O zařízení sleduje adresovou sběrnici CPU a reaguje na jakýkoli přístup CPU k adrese přiřazené tomuto zařízení a připojuje datovou sběrnici k hardwarovému registru požadovaného zařízení . Aby bylo možné přizpůsobit I / O zařízení, oblasti adres používaných CPU musí být vyhrazeny pro I / O a nesmí být dostupné pro normální fyzickou paměť. Rezervace může být trvalá nebo dočasná (jak je dosaženo přepnutím banky ). Příklad druhého se nachází v Commodore 64 , který používá formu mapování paměti k tomu, aby se v dosahu objevil RAM nebo I / O hardware 0xD000-0xDFFF.

Porty mapované I / O často používají speciální třídu instrukcí CPU určených speciálně pro provádění I / O, jako jsou instrukce ina outnalezené v mikroprocesorech založené na architektuře x86 a x86-64 . Různé formy těchto dvou instrukcí můžete kopírovat jednu, dvě nebo čtyři bajty ( outb, outwa outl, v uvedeném pořadí) mezi registru EAX nebo některého z členění tohoto registru je na CPU a stanovený I / O port, který je přiřazen k I / O zařízení. I / O zařízení mají samostatný adresní prostor od obecné paměti, a to buď zvláštním pinem „I / O“ na fyzickém rozhraní CPU, nebo celou sběrnicí vyhrazenou pro I / O. Protože adresový prostor pro I / O je izolovaný od adresního prostoru pro hlavní paměť, je někdy označován jako izolovaný I / O.

Přehled

Různé způsoby komunikace mezi CPU a zařízením, jako je mapování paměti, neovlivňují přímý přístup do paměti (DMA) pro zařízení, protože z definice je DMA komunikační metoda typu paměť-zařízení, která obchází CPU.

Hardwarová přerušení jsou další komunikační metodou mezi CPU a periferními zařízeními, avšak z mnoha důvodů se s přerušeními zachází vždy samostatně. Přerušení je inicializováno zařízením, na rozdíl od výše zmíněných metod, které jsou inicializovány CPU. Je také jednosměrný, protože informace proudí pouze ze zařízení do CPU. A konečně, každá přerušovací linka nese pouze jeden bit informací s pevným významem, konkrétně „událost, která vyžaduje pozornost v zařízení na této přerušovací linii“.

I / O operace mohou zpomalit přístup do paměti, pokud jsou sdílena adresa a datové sběrnice. Je to proto, že periferní zařízení je obvykle mnohem pomalejší než hlavní paměť. V některých architekturách porty mapované I / O pracují přes vyhrazenou I / O sběrnici, což problém zmírňuje.

Jednou z výhod I / O mapovaných do paměti je to, že vyřazením extra složitosti, kterou port I / O přináší, vyžaduje CPU méně vnitřní logiky a je tedy levnější, rychlejší, snadněji se buduje, spotřebovává méně energie a může být fyzicky menší; toto navazuje na základní principy redukované výpočetní sady instrukcí a je také výhodné ve vestavěných systémech . Jinou výhodou je, že protože se k adresování zařízení používají běžné paměťové instrukce, jsou pro I / O i pro paměť k dispozici všechny režimy adresování CPU a instrukce, které provádějí operaci ALU přímo na paměťovém operandu (načítání operand z paměťového místa, ukládání výsledku do paměťového místa nebo obojí) lze použít také s registry I / O zařízení. Naproti tomu I / O instrukce mapované porty jsou často velmi omezené a často poskytují pouze jednoduché operace načítání a ukládání mezi registry CPU a I / O porty, takže například k přidání konstanty do mapovaného portu registr zařízení by vyžadoval tři pokyny: přečíst port do registru CPU, přidat konstantu do registru CPU a zapsat výsledek zpět do portu.

Protože 16bitové procesory zastaraly a byly nahrazeny 32bitovými a 64bitovými obecně používanými aplikacemi, není rezervace rozsahů adresního prostoru paměti pro I / O menší problém, protože adresový prostor paměti procesoru je obvykle mnohem větší než požadovaný prostor pro všechny paměti a I / O zařízení v systému. Proto se stalo praktičtějším využívat výhod I / O mapovaných v paměti. I když však adresní prostor již není hlavním problémem, ani jedna metoda mapování I / O není univerzálně lepší než ta druhá, a budou existovat případy, kdy je stále vhodnější použití I / O mapovaných portů.

V architekturách založených na x86 je upřednostňován I / O mapovaný v paměti, protože instrukce, které provádějí I / O založené na portech, jsou omezeny na jeden registr: EAX, AX a AL jsou jediné registry, ze kterých lze data přesouvat do nebo z nich, a buď okamžitá hodnota v instrukci o velikosti bajtu, nebo hodnota v registru DX určuje, který port je zdrojovým nebo cílovým portem přenosu. Protože jakýkoli univerzální registr může odesílat nebo přijímat data do nebo z paměti a paměťově mapovaných I / O zařízení, paměťově mapované I / O používá méně instrukcí a může běžet rychleji než port I / O. AMD při definování architektury x86-64 nerozšířilo pokyny pro vstup / výstup portů tak, aby podporovaly 64bitové porty, takže 64bitové převody nelze provádět pomocí portů I / O.

Bariéry paměti

Vzhledem k tomu, že cache zprostředkovávají přístupů do paměti adresy, data zapsaná na různé adresy, může dostat paměti nebo registry periferií mimo pořadí programu, tedy v případě, software zapisuje data na adresu a pak zapisuje data na jinou adresu, cache zápisu vyrovnávací paměti není zaručit, že se data v tomto pořadí dostanou k periferním zařízením. Jakýkoli program, který neobsahuje pokyny pro vyprázdnění mezipaměti po každém zápisu v sekvenci, může vidět nechtěné IO efekty, pokud systém mezipaměti optimalizuje pořadí zápisu. Zápisy do paměti lze často změnit, aby se snížila redundance nebo aby se lépe využily cykly přístupu do paměti, aniž by se změnil konečný stav uloženého; zatímco stejné optimalizace mohou úplně změnit význam a účinek zápisů do I / O oblastí mapovaných do paměti.

Nedostatek předvídavosti při výběru paměťově mapovaných I / O oblastí vedl u starších generací počítačů k mnoha bariérám kapacity paměti. Návrháři zřídka očekávali, že stroje porostou, aby plně využily teoretickou kapacitu RAM architektury, a tak často používaly některé z bitů vyššího řádu adresního prostoru jako selektory pro I / O funkce mapované do paměti. Například bariéra 640 KB v IBM PC a derivátech je kvůli rezervování oblasti mezi 640 a 1024 KB (64k segmenty 10 až 16) pro oblast horní paměti . Tato volba zpočátku měla malý dopad, ale nakonec omezila celkový RAM dostupný v 20bitovém dostupném adresovém prostoru. 3 GB bariéra a PCI otvor jsou podobné projevy to s 32-bitovými adresových prostorech, obnovený podrobnosti o X86 procesu spouštění a MMU designu. 64bitové architektury mají často technicky podobné problémy, ale jen zřídka mají praktické důsledky.

Příklady

Ukázková mapa paměti systému
Rozsah adres ( šestnáctkově ) Velikost přístroj
0000–7FFF 32 KiB RAM
8000–80FF 256 bajtů Univerzální I / O
9 000–90FF 256 bajtů Řadič zvuku
A000 – A7FF 2 KiB Řadič videa / textově mapovaná RAM displeje
C000 – FFFF 16 KiB ROM

Jednoduchý systém postavený na 8bitovém mikroprocesoru může poskytovat 16bitové adresové řádky, což mu umožňuje adresovat až 64  kibibytů (KiB) paměti. V takovém systému může být prvních 32 KiB adresního prostoru přiděleno paměti RAM ( random access memory ), dalších 16 KiB paměti pouze pro čtení (ROM) a zbytek řadě dalších zařízení, jako jsou časovače, čítače, zobrazení videa čipy, zařízení generující zvuk atd.

Hardware systému je uspořádán tak, že zařízení na adresní sběrnici budou reagovat pouze na konkrétní adresy, které jsou pro ně určeny, zatímco všechny ostatní adresy jsou ignorovány. Toto je úkol obvodů pro dekódování adres a ten vytváří paměťovou mapu systému. Výsledkem je, že mapa paměti systému může vypadat jako v tabulce vpravo. Tato paměťová mapa obsahuje mezery, což je také docela běžné ve skutečných architekturách systému.

Za předpokladu, že čtvrtý registr grafického řadiče nastaví barvu pozadí obrazovky, může CPU nastavit tuto barvu zapsáním hodnoty do paměťového místa A003 pomocí své standardní instrukce pro zápis do paměti. Stejnou metodou lze grafy zobrazit na obrazovce zapisováním hodnot znaků do speciální oblasti paměti RAM ve video řadiči. Před levnou RAM, která umožňovala zobrazení s bitovým mapováním , byla tato metoda znakové buňky populární technikou pro počítačové video displeje (viz Textové uživatelské rozhraní ).

Základní typy dekódování adres

Typy dekódování adres, ve kterých může zařízení dekódovat adresy úplně nebo neúplně, zahrnují následující:

Kompletní (vyčerpávající) dekódování
1: 1 mapování jedinečných adres do jednoho hardwarového registru (umístění fyzické paměti). Zahrnuje kontrolu každého řádku adresní sběrnice .
Neúplné (částečné) dekódování
n: 1 mapování n jedinečných adres do jednoho hardwarového registru. Částečné dekódování umožňuje, aby místo v paměti mělo více než jednu adresu, což umožňuje programátorovi odkazovat na místo v paměti pomocí n různých adres. Lze také provést zjednodušení dekódovacího hardwaru pomocí jednodušší a často levnější logiky, která zkoumá pouze některé adresní řádky, když není potřeba celý adresní prostor CPU. Samotné dekódování je obvykle programovatelné, takže systém může podle potřeby překonfigurovat svou vlastní paměťovou mapu, i když se jedná o novější vývoj a obecně v rozporu s úmyslem být levnější.
Synonyma: foldback, multiply mapped, částečně mapovaný, aliasing adres .
Lineární dekódování
Adresní řádky se používají přímo bez dekódovací logiky. To se provádí u zařízení, jako jsou RAM a ROM, které mají posloupnost adresních vstupů, a u periferních čipů, které mají podobnou posloupnost vstupů pro adresování banky registrů. Lineární adresování se zřídka používá samostatně (pouze v případě, že na sběrnici je několik zařízení, protože použití čistě lineárního adresování pro více než jedno zařízení obvykle zbytečně zabere spoustu adresního prostoru), ale místo toho je kombinováno s jedním z dalších způsobů výběru zařízení nebo skupina zařízení, ve kterých lineární adresování vybírá jeden registr nebo umístění paměti.

Port I / O přes ovladače zařízení

V počítačích se systémem Windows lze k paměti přistupovat také prostřednictvím specifických ovladačů, jako je DOLLx8KD, který poskytuje vstupně-výstupní přístup v 8, 16 a 32 bitech na většině platforem Windows, počínaje Windows 95 až Windows 7. Instalace I / O ovladače portů zajistí přístup do paměti aktivací ovladačů jednoduchými voláními DLL umožňujícími vstupně-výstupní porty, a pokud to není potřeba, lze ovladač zavřít, aby se zabránilo neoprávněnému přístupu k vstupně-výstupním portům.

Linux poskytuje obslužný program pcimem , který umožňuje čtení a zápis na adresy MMIO. Linuxové jádro také umožňuje sledování přístupu MMIO z modulů jádra (ovladačů) pomocí ladicího nástroje mmiotrace jádra . Chcete-li to povolit, jádro Linuxu by mělo být kompilováno s povolenou odpovídající možností. mmiotrace se používá k ladění ovladačů zařízení s uzavřeným zdrojovým kódem.

Viz také

Reference