Loader (számítástechnológia)
Ez a szócikk nem tünteti fel a független forrásokat, amelyeket felhasználtak a készítése során. Emiatt nem tudjuk közvetlenül ellenőrizni, hogy a szócikkben szereplő állítások helytállóak-e. Segíts megbízható forrásokat találni az állításokhoz! Lásd még: A Wikipédia nem az első közlés helye. |
A számítógépes rendszerekben a betöltő (loader) az operációs rendszer része, amely felelős a programok és könyvtárak betöltéséért. Ez a program indításának egyik szükséges szakasza, mivel a programokat a memóriába helyezi és előkészíti a végrehajtásra. A program betöltése magában foglalja a program utasításait tartalmazó futtatható fájl tartalmának beolvasását a memóriába, majd más szükséges előkészítő feladatok végrehajtását a futtatható fájl előkészítéséhez. A betöltés befejezése után az operációs rendszer elindítja a programot úgy, hogy a vezérlést átruházza a betöltött programkódnak.
Valamennyi operációs rendszer, amely támogatja a programbetöltést, rendelkezik betöltővel, kivéve a rendkívül specializált számítógépes rendszereket, amelyek csak rögzített speciális programkészlettel rendelkeznek. A beágyazott rendszerekben általában nincsenek betöltők, ehelyett a kód közvetlenül a ROM-ról vagy hasonlókról hajt végre. Maga az operációs rendszer betöltéséhez az indítás részeként egy speciális rendszerindítót használnak. Számos operációs rendszerben a betöltő állandóan a memóriában tartózkodik, bár egyes, a virtuális memóriát támogató operációs rendszerek lehetővé tehetik, hogy a betöltő a memória egy lapozható régiójában legyen.
A virtuális memóriát támogató operációs rendszerek esetében a betöltő nem feltétlenül másolja a futtatható fájl tartalmát a memóriába, hanem egyszerűen meg tudja mondani a virtuális memória alrendszernek, hogy van egy leképezés a futó fájlok tárolására kijelölt memóriaterület között. A programkód és a kapcsolódó futtatható fájlok tartalma. (Lásd a memóriában leképezett fájlokat.) Ezután a virtuális memória alrendszere rájön, hogy ha a futó program valóban eléri ezeket a kitöltetlen memóriaterületeket, akkor szükség szerint meg kell töltenie az oldalakat ezzel a memóriaterülettel. Ez azt jelenti, hogy a program egyes kódjai csak akkor kerülnek másolásra a memóriába, amikor azokat ténylegesen használják, míg a fel nem használt kódok egyáltalán nem töltődnek be a memóriába.
Feladatok
[szerkesztés]A Unix- ban a betöltő a rendszerhívás execve()
kezelője.[1] A Unix betöltő feladatai a következők:
- validáció (engedélyek, memóriaigények stb.);
- a program képének lemásolása a lemezről a fő memóriába;
- a parancssori argumentumok másolása a veremben;
- a regiszterek inicializálása (pl. a veremmutató);
- ugrás a program belépési pontjához (
_start
).
A Microsoft Windows 7 és újabb, a rakodó a LdrInitializeThunk
funkció foglalt ntdll.dll, hogy a következőt teszi:
- a struktúrák inicializálása magában a DLL-ben (azaz kritikus szakaszok, modullisták);
- a futtatható fájl ellenőrzése a betöltéshez;
- egy halom létrehozása (az
RtlCreateHeap
függvényen keresztül); - a környezeti változó blokk és a PATH blokk kiosztása;
- a futtatható és az NTDLL hozzáadása a modullistához ( kettős linkelésű lista);
- a KERNEL32 betöltése. DLL számos fontos funkció megszerzéséhez, például
BaseThreadInitThunk
; - a végrehajtható fájlok (azaz a dinamikus linkű könyvtárak) rekurzív betöltése (ellenőrizze az import importját, importját és így tovább);
- hibakeresési módban a rendszer töréspontjának emelése;
- a DLL-ek inicializálása;
- szemétgyüjtés;
- az
NtContinue
meghívása a betöltő függvénynek adott kontextusparaméteren (azaz azRtlUserThreadStart
ugrás, amely elindítja a futtatható fájlt)
Rakodók áthelyezése
[szerkesztés]Bizonyos operációs rendszereknek szükségük van a rakodók áthelyezésére, amelyek a futtatható fájlban lévő címeket (mutatókat) állítják be annak érdekében, hogy kompenzálják a cím változásait, amelyeken a betöltés elkezdődik. Azok az operációs rendszerek, amelyekben a rakodók áthelyezésére van szükség, amelyekben a program nem mindig ugyanazon a helyen van betöltve a címtérben, és amelyekben a mutatók abszolút címek, nem pedig eltolások a program alapcímétől. Néhány jól ismert példa az IBM OS/360 rendszere a IBM System/360 nagyszámítógépeire, valamint leszármazói, köztük a z/OS a z/Architecture nagygépekre.
OS/360 és származékai
[szerkesztés]Az OS/360 és leszármazott rendszerekben a (privilegizált) operációs rendszer létesítményt IEWFETCH-nak hívják[2] és ez az operációs rendszer felügyeletének belső eleme, míg a (nem privilegizált) LOADER alkalmazás sokféle funkciót képes ellátni, plusz a Linkage Editoré, és teljesen kívül esik az operációs rendszer felügyeletén (bár bizonyosan sok felügyeleti szolgáltatást használ).
Az IEWFETCH magasan specializált csatornaprogramokat használ, és elméletileg lehetséges egy teljes futtatható fájl betöltése és áthelyezése a DASD adathordozó egyetlen fordulatán belül (kb. 16,6 ms max, 8,3 ms átlag, "örökölt" esetén 3600 fordulatszám-meghajtók). A sávméretet meghaladó terhelési modulok esetében lehetőség van a teljes modul betöltésére és áthelyezésére is anélkül, hogy elveszítené a hordozó forradalmát.
Az IEWFETCH tartalmaz egy úgynevezett overlay struktúrát is, amely megkönnyíti a potenciálisan nagyon nagyméretű futtatható fájlok futtatását (akár 44 KB az operációs rendszer egyes verzióinál, de 88 KB és 128 KB gyakoribb) a legkisebb memóriamodellben.
Maga az operációs rendszer magja (a Supervisor mindig rezidens része) úgy van formázva, hogy kompatibilis legyen az IEWFETCH lecsupaszított verziójával. A normál futtatható fájlokkal ellentétben az OS magja "szétszórt": a mag egyes részei a memória különböző részeibe kerülnek; különösen bizonyos rendszer táblákra van szükség ahhoz, hogy a kezdeti 64 alatt legyenek KB, míg más táblák és kódok máshol tartózkodhatnak.
A rendszer Linkage Editor alkalmazásának neve IEWL.[3] Az IEWL fő feladata a terhelési modulok (futtatható programok) és az objektum modulok (mondjuk az összeszerelők és fordítók kimenete), beleértve a könyvtárakba történő "automatikus hívásokat" (magas szintű nyelvű "beépített funkciók") formátumba kapcsolása amelyet a leghatékonyabban az IEWFETCH tölthet be. Számos szerkesztési lehetőség létezik, de egy hagyományos alkalmazáshoz ezek közül csak néhányat alkalmaznak.
A terhelési modul formátuma tartalmazza a kezdeti "szöveges rekordot", majd a szöveges rekord "mozgási és/vagy ellenőrzési nyilvántartását", majd további szöveges rekordokat és pár mozgás- és/vagy ellenőrzési rekordot a fájl végéig.
A szöveges rekordok általában nagyon nagyok; az áthelyezési és/vagy ellenőrzési rekordok kicsik, mert az IEWFETCH három áthelyezési és/vagy vezérlő rekord puffere 260 bájtban van rögzítve (természetesen kisebb migrációs és/vagy vezérlő rekordok is lehetségesek, de 260 bájt a lehető legnagyobb). Az IEWL biztosítja ezt a korlátozásnak való megfelelés érdekében. Ha szükséges, a következő szöveges rekordok elé helyezzen be további továbbítási rekordokat. Ha szükséges, ebben a különleges esetben a rekordok sorrendje lehet: ..., szöveges rekordok, átviteli rekordok, ..., ellenőrzési rekordok, szöveges nyilvántartások.
Az áthelyezési és/vagy vezérlőrekord pufferen belül egy speciális bájtot használnak "letiltott bit spin" kommunikációs területként, és egyedi értékre inicializálják. Az áthelyezési és/vagy vezérlési rekord CCW-fájljának olvasása a program által vezérelt megszakításbit-beállítással rendelkezik. A processzor ezzel értesítést kap, amikor a CCW-hez a csatorna egy speciális IOS kimeneten keresztül jutott el. Ezen a ponton a processzor belép a "letiltott bit centrifugálás" hurokba (néha "a világ legrövidebb hurokjának"). Amint ez a bájt megváltozik az inicializált értékhez képest, a CPU kilép a bit spinből, és az áthelyezés bekövetkezik a médiumon belüli "rés" alatt az áthelyezési és/vagy vezérlőrekord és a következő szöveges rekord között. Ha az áthelyezés a következő rekord előtt befejeződik, az olvasást követő NOP CCW TIC-re változik, és a betöltés és áthelyezés a következő puffer használatával folytatódik; ha nem, akkor a csatorna leáll a NOP CCW-nél, amíg az IEWFETCH egy másik speciális IOS-kijáraton keresztül nem indítja újra. A három puffer folyamatos, kör alakú sorban van, mindegyik a következőre mutat, az utolsó pedig az elsőre mutat, és három puffert folyamatosan újrafelhasználnak, mivel betöltés és áthelyezés folyik.
Az IEWFETCH ezáltal bármilyen praktikus méretű és minimális idő alatt betölthet és áthelyezhet egy rakománymodult.
Dinamikus kapcsolók
[szerkesztés]A dinamikus összekapcsoló betöltők egy másik típusú betöltő, amely megosztott könyvtárakat (például .so fájlokat, .dll fájlokat vagy .dylib fájlokat) tölt be és kapcsol össze a már betöltött futó programokkal.
Jegyzetek
[szerkesztés]- ↑ exec. The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. The Open Group. (Hozzáférés: 2008. június 23.)
- ↑ IBM Corporation. IBM OS MVT Supervisor (1972)
- ↑ IBM Corporation. IBM OS Linkage Editor and Loader (1972)
Fordítás
[szerkesztés]Ez a szócikk részben vagy egészben a Loader (computing) című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.