Loader
Může být na světě něco jednoduššího, než spuštění programu? Zvláště pak v dnešní době, plné grafických uživatelských rozhraní, ikon a sloganů o tom, že celý svět je na dosah jediného kliknutí?
Pro uživatele možná nic jednoduššího skutečně neexistuje, ale operační systém asi bude mít na věc poněkud jiný názor. Pro něj totiž může spuštění určitého programu představovat nemalý kus práce. Proč?
Má-li být určitý program spuštěn, je nutné jej nejprve umístit do operační paměti, a pak mu předat řízení. A zde může být první kámen úrazu - je v okamžiku spouštění k dispozici dostatečně velký objem volné paměti? Pokud ano, je vše v pořádku. Pokud ne, ještě nemusí být vše ztraceno. Operační systém totiž může používat i takové techniky práce s pamětí, které mu umožňují existenci dostatečně velkého objemu volné paměti pouze předstírat - příkladem může být tzv. stránkování na žádost (demand paging), či jiné techniky, realizující tzv. virtuální paměť.
Mnohem větší problém však může způsobovat jiná skutečnost - i když operační systém v okamžiku spouštění programu najde dostatečně velký objem volné paměti, nemůže nikdy dopředu zaručit, na jakém místě, resp. ve které části existující operační paměti to bude. V případě víceúlohových operačních systémů totiž záleží na tom, kolik jiných úloh právě běží, resp. je umístěno v paměti. Stejně tak tomu může být i v případě jednouživatelských a jednoúlohových operačních systémů, například starého známého MS DOSu - také tento operační systém nemůže nikdy dopředu vědět, kolik rezidentních programů si jeho uživatel nainstaluje, a tudíž nemůže dopředu vědět ani to, kde najde dostatečně velké volné místo.
Teď se ale na celou věc podívejme z poněkud jiného pohledu: vadí někomu či něčemu, když nelze předem stanovit, do kterého místa operační paměti bude program při svém spouštění zaveden? Tedy když nelze předem, pevně a jednoznačně stanovit, na kterých adresách bude takovýto program „počítat"? Odpověď zní následovně: nemusí to vadit tehdy, je-li program napsán tak, aby se nikdy neodkazoval na žádnou adresu přímo, přesněji jako na tzv. absolutní adresu, stylem „skoč na adresu 1234", ale vždy používal jen tzv. nepřímé odkazy, typu „skoč dopředu o 8 bytů". Není jistě těžké nahlédnout, že při důsledném použití samých relativních odkazů lze výsledný program umístit na kterékoli místo do operační paměti, a zde jej spustit. Otázkou ovšem je, zda všechny programy mohou být psány tímto způsobem.
Odpověď na tuto otázku je v rukou lidí, kteří navrhují nový mikroprocesor, jeho instrukční soubor a především možné způsoby adresování. Pokud svůj mikroprocesor navrhnou šikovně, je v principu možné pro něj psát takové programy, které neobsahují žádné absolutní odkazy do paměti, ale jen samé odkazy relativní. O takovýchto programech se pak také říká, že jsou tzv. relokovatelné - že je možné je umístit do libovolného místa paměti. Relokovatelné programy je dokonce možné v operační paměti přemisťovat, a při každém přesunu stačí správně změnit jen základ, ke kterému jsou všechny relativní odkazy vztaženy. Problém je ovšem v tom, že velká většina dnešních procesorů takto šikovně navržena není.
Platí to bohužel i pro procesory Intel řady 80x86, používané v počítačích PC. Většina jejich strojových instrukcí sice může používat relativní adresy a umožňovala by tedy psát snadno relokovatelné programy. Bohužel ale v repertoáru strojových instrukcí procesorů 80x86 existují i takové instrukce, které používají absolutní adresy. Jsou to například instrukce pro tzv. vzdálené skoky či vzdálená volání, jejichž použití se prakticky nelze vyhnout, je-li potřeba napsat program větší jako 64 kbytů. Co to ale znamená?
Výsledný efekt je ten, že ani programy, sestavené pro prostředí MS DOSu sestavujícími programy (linkery) z tzv. objektových modulů (vzniklých překladem zdrojových modulů, viz minulé a předminulé vydání rubriky), nejsou ještě přímo spustitelné. Alespoň ne v tom smyslu, že by je bylo možné jednoduše vzít, umístit do právě volného místa paměti, z předat jim řízení. Místo toho je nutné nejprve správně pozměnit ty jejich části, které odpovídají absolutním odkazům do paměti, a které jsou tudíž závislé na konkrétním umístění spouštěného programu. Toto tvrzení se přitom týká jak souborů s příponou COM, tak i souborů s příponou EXE, které jsou v prostředí MS DOSu běžně označovány jako spustitelné. Jestliže tedy uživatel zadá operačnímu systému MS DOS příkaz ke spuštění určitého souboru COM či EXE, musí jej MS DOS vzít, a podle momentálního stavu paměti správně „dopočítat". Míra tohoto „dopočítání", představujícího především správné nastavení absolutních odkazů do paměti, je u obou druhů souborů různá. U souborů COM, které mohou mít jen omezenou velikost (do 64 KB), jde v podstatě jen o jednoduché dosazení číselné konstanty na určitá místa v kódu programu. V případě souborů s příponou EXE, jejichž velikost není apriorně omezena, je „dopočítávání" výrazněji složitější. Součástí souborů EXE proto musí být nejen kód samotného programu, ale ještě také doplňující informace, podle kterých toto „dopočítávání" probíhá.
Vraťme se ale zpět od jednoho konkrétního operačního systému (MS DOSu) do obecné roviny. Z toho, co jsme si naznačili, by mělo být snadné nahlédnout, že každý operační systém musí při spouštění programů provádět určité, mnohdy i dosti netriviální akce. Konkrétní část operačního systému, která toto zajišťuje, se označuje jako tzv. zaváděcí program či zaváděč, anglicky loader.