Vyšlo v týdeníku Computerworld č. 24/93 v roce 1993
Vytištěno z adresy: http://www.earchiv.cz/a93/a324c120.php3

Memory Mapped vs. Isolated I/O

Zamysleli jste se někdy nad tím, jak je možné, že dnešní počítače dokáží pracovat s tak různorodými druhy periferních zařízení (od tiskáren, myší, plotterů až po čidla v atomových reaktorech či regulační ventily ústředního topení), když životní obzor těchto počítačů je omezen jen na bity, byty či slova a veškerý styk programů s jejich okolím má povahu čtení jednotlivých bitů a jejich nastavování na jedničky a nuly?

Důsledkem je skutečnost, že jakékoli periferní zařízení se vůči procesoru a na něm probíhajícímu programu musí "tvářit" jako sada vstupně-výstupních registrů (též: vstupně-výstupních bran, V/V portů, viz minule), ze kterých lze něco číst a do kterých lze zapisovat. Program, který chce s příslušným periferním zařízením pracovat, pak musí přesně vědět, které vstupně/výstupní registry to jsou, jaký je přesný význam toho, co si z nich může přečíst, a jaký je přesný efekt toho, když do některého z nich něco zapíše. Například když chce program vytisknout znak na tiskárně, musí jej nejprve zapsat do určitého konkrétního vstupně výstupního registru, pak změnit hodnotu jednoho konkrétního bitu v jiném vstupně-výstupním registru a za určitý časový interval tento bit zase vrátit zpět do jeho původního stavu. Z hlediska programu pak již není příliš podstatné, jak jsou jednotlivé vstupně-výstupní registry napojeny na "vnější svět" - například jakým konkrétním způsobem je zajišťován převod nějaké sledované analog ové veličiny do digitálního tvaru a jak je číselně vyjádřena. Místo toho je pro daný program důležité, kde si tuto hodnotu může přečíst, v jakém tvaru, jak často je aktualizována atd.

Co je ovšem pro obslužné programy velmi podstatné, je způsob, jak se ke zmíněným vstupně-výstupním registrům (V/V bránám) vůbec dostat. V principu totiž existují dva odlišné přístupy k řešení této otázky.

První spočívá v tom, že vstupně-výstupní registry se budou "chovat" naprosto stejně jako paměťová místa operační paměti. Budou tedy mít přiděleny adresy stejného typu jako skutečná paměť, a v důsledku toho bude možné pracovat s těmito registry prostřednictvím stejných instrukcí, které jsou určeny pro práci s pamětí. Tato možnost ve své podstatě znamená, že existuje jen jediný adresový prostor (adresový prostor paměti) a jednotlivé vstupně-výstupní registry jsou do tohoto adresového prostoru logicky začleněny - tzv. zamapovány. Odsud také pojmenování této možnosti: memory mapped I/O. V anglicky psané odborné literatuře je však možné se setkat i s poněkud zavádějícím označením memory mapping, které se pak doslovně překládá jako mapování paměti. Zavádějící je označení proto, že naznačuje určitou změnu ve způsobu přístupu k paměti jako takové, zatímco ve skutečnosti jde jen o chování zmíněných vstupně-výstupních registrů. Věcně správnější je mluvit spíše o zamapování do paměti.

Alternativní možnost k zamapování vstupně-výstupních registrů do paměti je takové řešení, při kterém V/V registry mají přiděleny adresy jiného typu než paměťová místa skutečné paměti (tzv. V/V adresy, někdy nepříliš správně porty, viz minule). Prostor těchto V/V adres je pak disjunktivní s prostorem adres paměťových, a snad proto se tento případ označuje jako isolated I/O (doslova: izolovaný vstup/výstup). Oddělení obou adresových prostorů znamená, že u každé adresy musí být vždy jednoznačně určeno, do kterého adresového prostoru patří. V praxi se tato otázka řeší tak, že pro přístup do jednotlivých adresových prostorů existují různé strojové instrukce. Vedle instrukcí pro práci s pamětí (které používají paměťové adresy) pak existují i speciální instrukce pro přístup ke vstupně-výstupním registrům, které zase používají výhradně V/V adresy. Repertoár těchto vstupně-výstupních instrukcí však bývá mnohem chudší než repertoár paměťových instrukcí. Nezřídka jde jen o dvě instrukce, pojmenované příznačně IN a OUT.

Jaké jsou však výhody obou možností, a v čem jsou naopak jejich nevýhody? U zamapování do paměti je výhodou možnost používat i pro vstupně-výstupní operace relativně bohatý repertoár instrukcí pro práci s pamětí. Nevýhodou je pak to, že vstupně-výstupní registry obsazují určitou část adresového prostoru paměti, která pak nemůže být využita pro skutečnou paměť. Naopak u izolovaného vstupu/výstupu je možné využít pro skutečnou paměť celý adresový prostor paměti, ovšem za cenu toho, že pro zajišťování vstupně-výstupních operací bude k dispozici jen velmi omezený výběr strojových instrukcí.

Zajímavé je zamyslet se i nad technickým řešením obou uvedených možností. Adresa, kterou procesor vysílá po adresové sběrnici, může mít používání izolovaného vstupu/výstupu dvojí možný význam - může jít o paměťovou adresu nebo o V/V adresu. Procesor proto musí nějakým způsobem signalizovat svému okolí i to, který z těchto dvou případů nastal. Možností je více: může jít například o samostatný signál, který rozlišuje paměťovou a V/V adresu, nebo to může být vzájemná kombinace více signálů, které společně rozlišují čtení z paměti, zápis do paměti, čtení ze vstupního registru a zápis do výstupního registru. V praxi vždy záleží na tom, zda konkrétní procesor počítá s možností používat izolovaný výstup, a zda je tudíž vybaven strojovými instrukcemi pro vstup a výstup (a také příslušnými signály, které určují druh adresy na adresové sběrnici), nebo nikoli.

Příkladem procesorů, které počítají s možností izolovaného vstupu/výstupu, jsou všechny mikroprocesory firmy Intel. Tato jejich vlastnost však neznamená, že by u nich zamapování vstupně-výstupních registrů do paměti nebylo možné - vychází-li nějaký procesor vstříc izolovanému vstupu/výstupu tím, že je vybaven vstupně-výstupními instrukcemi a nezbytnými rozlišujícími signály, nabízí tím vlastně jen určitou možnost, která může, ale nemusí být využívána. Zamapování vstupně-výstupních registrů je tedy možné používat např. i u mikroprocesorů Intel (i když se to obvykle nedělá).

Jinak je tomu u procesorů, které izolovanému vstupu/výstupu vstříc nevychází a nejsou za tímto účelem vybaveny potřebnými strojovými instrukcemi a rozlišujícími signály. Konstruktéry počítačů a programátory pak takovéto procesory nutí používat zamapování vstupně-výstupních registrů do paměti. Příkladem mohou být všechny mikroprocesory firmy Motorola.