DLL

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

DLL (Dynamic-link library, dynamicky linkovaná knihovna) je v informatice implementace konceptu sdílených knihoven společnosti Microsoft pro operační systém Microsoft Windows, který je též používán v OS/2. Soubory s knihovnami obvykle používají příponu DLL, OCX (pro ActiveX prvky) nebo DRV (pro staré systémové ovladače). Formát DLL souborů je stejný jako v případě EXE souborů, tedy Portable Executable (PE) pro 32bitové a 64bitové Windows nebo New Executable (NE) pro 16bitové Windows. Stejně jako EXE soubory mohou DLL obsahovat kód, data a zdroje v libovolné kombinaci.

Obsah

[editovat] Historie DLL souborů

V prvních verzích operačního systému Microsoft Windows byly všechny procesy spouštěny v jednom adresovém prostoru a díky kooperativnímu multitaskingu se procesy explicitně vzdávaly procesoru. Všechny funkce operačního systému poskytoval MS-DOS, zatímco všechny vysokoúrovňové služby byly poskytovány pomocí DLL. Aplikační rozhraní pro vykreslování (GDI) bylo implementováno v DLL zvané GDI.EXE a uživatelské rozhraní v USER.EXE. Tyto vrstvy nad DOSem byly sdílené pro všechny běžící procesy ovšem nikoliv s cílem provozovat systém na strojích s méně než jedním megabajtem paměti, ale s cílem umožnit procesům vzájemně spolupracovat. Kód v GDI překládal příkazy pro vykreslování do specifických instrukcí různých zařízení. V případě displeje byly měněny body ve framebufferu, v případě tiskárny byly příkazy transformovány na pokyny pro tiskárnu. Aby GDI mohlo pracovat s různými zařízeními, načítaly se do paměti tak zvané ovladače zařízení.

Stejná architektura, pomocí které GDI načítalo ovladače pro různá zařízení, umožnila systému načíst programy tak, že bylo možné z těchto programů volat API funkce knihoven USER a GDI. Tento koncept se nazývá dynamické linkování.

U nesdílených, tedy statických, knihoven se jejich kód jednoduše ve fázi linkování přidává do programů, které příslušný kód volají. Pokud více programů volají stejnou rutinu, bude kód této rutiny přidán do obou programů. V případě dynamického linkování je sdílený kód umístěn do separátního souboru. Programy jsou s těmito soubory spojeny dynamicky pomocí operačního systému.

DLL soubory poskytují standardní výhody sdílených knihoven, mezi které patří zejména modularita. Modularita umožňuje provést změny v jedné knihovně sdílené více aplikacemi bez nutnosti tyto aplikace modifikovat. Další přínos modularity je v možnosti použití generického rozhraní pro zásuvné moduly. Rozhraní umožňuje integraci různých modulů do již existujících aplikací opět bez nutnosti aplikace modifikovat. Tento koncept dynamické rozšiřitelnosti je hojně využíván v modelu COM.

V systémech Windows 1.x, 2.x a 3.x sdílejí všechny okenní aplikace stejný adresní prostor, do kterého jsou DLL načteny pouze jednou. Data těchto knihoven jsou pak sdílena všemi aplikacemi, což mohlo být využito k nepřímé meziprocesové komunikaci, ale také to mohlo vést k poškození nějaké aplikace. Od Windows 95 měl pak každý proces svůj vlastní adresní prostor. Zatímco kód dynamických knihoven může být sdílen, data jsou privátní s výjimkou explicitního vyžádání ze strany knihovny.

I když se DLL knihovny staly jádrem architektury systému Windows, mají mnoho nedostatků, které se souhrnně nazývají DLL hell.[1] V současné době Microsoft poskytuje několik řešení tohoto problému. Patří mezi ně platforma Microsoft .NET nebo virtualizace založená na Microsoft Virtual PC a Microsoft Application Virtualization, protože nabízí vysoký stupeň izolace aplikací. Dalším řešením pak je implementace Side-by-Side Assembly.

[editovat] Vlastnosti DLL souborů

[editovat] Správa paměti

Ve Win32 jsou DLL soubory organizovány do sekcí, kde každá sekce obsahuje atributy informující o tom, zda je například v sekci povolen zápis nebo je pouze pro čtení a také zda je vykonatelná (pro kód) nebo není (pro data).

Kód v DLL knihovnách je obvykle sdílen všemi procesy, které tyto knihovny využívají. Knihovny jsou tak ve fyzické paměti načteny pouze jednou a nejsou odkládány do stránkovacího souboru.

Datové sekce jsou obvykle privátní, takže procesy využívající DLL mají vlastní kopii všech dat knihovny. Datové sekce lze ovšem sdílet a využít je k meziprocesové komunikaci, což může být bezpečnostní problém, protože poškození sdílených dat může způsobit nepřijatelné chování jiných procesů, které tyto data používají. Například proces běžící pod účtem běžného uživatele může pomocí sdílených dat ovládnout jiný proces běžící s vyšším oprávněním. Tento fakt je důvodem k upuštění od sdílených datových sekcí v DLL knihovnách.

[editovat] Rozlišení a importování funkcí

Každá funkce exportovaná DLL knihovnou je identifikována číslem a volitelně i jménem. Stejně tak může být funkce importována z DLL buď na základě čísla nebo jména. Číslo reprezentuje pozici ukazatele funkce v tabulce adres exportovaných funkcí a je běžné, že interní funkce jsou exportované pouze svým číslem. Ve Windows API se pak ve většině případů zachovávají mezi verzemi názvy, zatímco pořadí se může měnit, takže se nelze na takový import spoléhat.

Import funkcí pomocí pořadí není o moc rychlejší, protože tabulka exportovaných funkcí je seřazena podle jména, takže k nalezení funkce lze použít binární vyhledávání. V 16-bitových verzích systému Windows nebyla tabulka řazena, takže vyhledání mohlo být o něco pomalejší.

Spustitelný soubor je možné vázat na konkrétní verzi knihovny a zjistit adresu importované funkce již v době kompilace. V takovém případě uloží linker časovou značku a kontrolní součet knihovny, ze které se importuje. Windows pak za běhu zkontrolují, zda se požadovaná knihovna používá a pokud ano, obejde standardní proces importování. V opačném případě proběhne import klasickou cestou.

[editovat] Odložené načtení

Normálně se aplikace využívající jistou knihovnu nespustí, pokud tato knihovna nemůže být nalezena. Nicméně aplikace může být linkována tak, že se systém nesnaží nalézt knihovnu ihned, ale až když je zavolána nějaká funkce knihovny.[2] V případě, že knihovna není nalezena, nelze ji načíst nebo konkrétní funkce neexistuje, vygeneruje operační systém výjimku, kterou může aplikace zachytit a vhodně ošetřit. Pokud aplikace výjimku nezachytí, operační systém aplikaci ukončí s hlášením o chybě.

[editovat] Reference

  1. The End of DLL Hell [online]. Microsoft Corporation, [cit. 2009-07-11]. Dostupné online.  
  2. Linker Support for Delay-Loaded DLLs [online]. Microsoft Corporation, [cit. 2009-07-11]. Dostupné online.  
Osobní nástroje
Jmenné prostory

Varianty
Akce
Navigace
Tisk/export
Nástroje
V jiných jazycích