Program ładujący (komputer) - Loader (computing)
W systemach komputerowych ładowarka jest częścią systemu operacyjnego , który jest odpowiedzialny za ładowanie programów i bibliotek . Jest to jeden z podstawowych etapów procesu uruchamiania programu, ponieważ umieszcza programy w pamięci i przygotowuje je do wykonania. Ładowanie programu polega na wczytaniu do pamięci zawartości pliku wykonywalnego zawierającego instrukcje programu, a następnie wykonaniu innych wymaganych czynności przygotowawczych w celu przygotowania pliku wykonywalnego do uruchomienia. Po zakończeniu ładowania system operacyjny uruchamia program, przekazując sterowanie do załadowanego kodu programu.
Wszystkie systemy operacyjne obsługujące ładowanie programów mają programy ładujące, z wyjątkiem wysoce wyspecjalizowanych systemów komputerowych, które mają tylko stały zestaw wyspecjalizowanych programów. Systemy wbudowane zazwyczaj nie mają programów ładujących, a zamiast tego kod jest wykonywany bezpośrednio z pamięci ROM lub podobnego. W celu załadowania samego systemu operacyjnego w ramach bootowania używany jest wyspecjalizowany program ładujący . W wielu systemach operacyjnych moduł ładujący znajduje się na stałe w pamięci, chociaż niektóre systemy operacyjne obsługujące pamięć wirtualną mogą zezwalać na umieszczenie modułu ładującego w obszarze pamięci, który można stronicować .
W przypadku systemów operacyjnych obsługujących pamięć wirtualną program ładujący może w rzeczywistości nie kopiować zawartości plików wykonywalnych do pamięci, ale może po prostu zadeklarować podsystemowi pamięci wirtualnej, że istnieje mapowanie między regionem pamięci przydzielonym do przechowywania uruchomionych kod programu i zawartość powiązanego pliku wykonywalnego. (Zobacz plik mapowany w pamięci .) Podsystem pamięci wirtualnej jest następnie uświadamiany, że strony z tym regionem pamięci muszą być wypełnione na żądanie, jeśli i kiedy wykonanie programu faktycznie dotrze do tych obszarów niewypełnionej pamięci. Może to oznaczać, że części kodu programu nie są w rzeczywistości kopiowane do pamięci, dopóki nie zostaną faktycznie użyte, a nieużywany kod może nigdy nie zostać załadowany do pamięci.
Obowiązki
W Unix , ładowarka jest teleskopowa dla wywołania systemowego execve()
. Zadania programu ładującego Unix obejmują:
- walidacja (uprawnienia, wymagania dotyczące pamięci itp.);
- kopiowanie obrazu programu z dysku do pamięci głównej ;
- kopiowanie argumentów wiersza poleceń na stos ;
- inicjalizacja rejestrów (np. wskaźnik stosu);
- przejście do punktu wejścia programu (
_start
).
W systemie Microsoft Windows 7 i nowszych program ładujący jest LdrInitializeThunk
funkcją zawartą w ntdll.dll , która wykonuje następujące czynności:
- inicjalizacja struktur w samej bibliotece DLL (tj. sekcje krytyczne , listy modułów);
- walidacja pliku wykonywalnego do załadowania;
- tworzenie sterty (poprzez funkcję
RtlCreateHeap
); - alokacja bloku zmiennych środowiskowych i bloku PATH;
- dodanie pliku wykonywalnego i NTDLL do listy modułów (lista podwójnie połączona );
- ładowanie KERNEL32.DLL w celu uzyskania kilku ważnych funkcji, na przykład
BaseThreadInitThunk
; - ładowanie importów plików wykonywalnych (tj. bibliotek z łączem dynamicznym ) rekurencyjnie (sprawdź importy importów, ich importy itd.);
- w trybie debugowania, podniesienie punktu przerwania systemu;
- inicjalizacja bibliotek DLL;
- zbieranie śmieci;
- wywołanie
NtContinue
parametru kontekstu przekazanego funkcji ładującej (tj. skoku doRtlUserThreadStart
, który uruchomi plik wykonywalny)
Przemieszczanie ładowarek
Niektóre systemy operacyjne wymagają relokacji programów ładujących, które dostosowują adresy (wskaźniki) w pliku wykonywalnym, aby skompensować różnice w adresie, od którego rozpoczyna się ładowanie. Systemy operacyjne, które wymagają relokacji programów ładujących, to te, w których program nie zawsze jest ładowany do tego samego miejsca w przestrzeni adresowej i w których wskaźniki są adresami bezwzględnymi, a nie przesunięciami od adresu podstawowego programu . Niektóre dobrze znane przykłady to OS / 360 firmy IBM dla ich komputerów mainframe System / 360 i jego następcy, w tym system z / OS dla komputerów mainframe z / Architecture .
OS / 360 i pochodne
W systemie OS / 360 i systemach podrzędnych (uprzywilejowana) funkcja systemu operacyjnego nosi nazwę IEWFETCH i jest wewnętrznym składnikiem programu OS Supervisor, podczas gdy (nieuprzywilejowana) aplikacja LOADER może wykonywać wiele tych samych funkcji, a także funkcje Linkage Editor i jest całkowicie zewnętrzny w stosunku do OS Supervisor (chociaż z pewnością korzysta z wielu usług Supervisor).
IEWFETCH wykorzystuje wysoce wyspecjalizowane programy kanałowe i teoretycznie możliwe jest załadowanie i przeniesienie całego pliku wykonywalnego w ciągu jednego obrotu nośnika DASD (około 16,6 ms maksymalnie, średnio 8,3 ms na „starszych” dyskach o prędkości obrotowej 3600 obr./min). W przypadku modułów ładowania, które przekraczają rozmiar ścieżki, możliwe jest również załadowanie i przeniesienie całego modułu bez utraty rewolucji nośnika.
IEWFETCH zawiera również udogodnienia dla tak zwanych struktur nakładkowych, co ułatwia uruchamianie potencjalnie bardzo dużych plików wykonywalnych w modelu minimalnej pamięci (tak małe jak 44 KB w niektórych wersjach systemu operacyjnego, ale 88 KB i 128 KB są bardziej powszechne).
Jądro systemu operacyjnego (zawsze rezydentna część nadzorcy) samo jest sformatowane w sposób zgodny z okrojoną wersją IEWFETCH. W przeciwieństwie do zwykłych plików wykonywalnych jądro systemu operacyjnego jest ładowane rozpraszająco: części jądra są ładowane do różnych części pamięci; w szczególności niektóre tabele systemowe muszą znajdować się poniżej początkowych 64 KB, podczas gdy inne tabele i kod mogą znajdować się gdzie indziej.
Systemowa aplikacja Linkage Editor nosi nazwę IEWL. Główną funkcją IEWL jest powiązanie modułów ładowania (programów wykonywalnych) i modułów obiektów (danych wyjściowych, powiedzmy, asemblerów i kompilatorów), w tym „automatycznych wywołań” bibliotek („funkcje wbudowane” języka wysokiego poziomu) w format który może być najbardziej efektywnie załadowany przez IEWFETCH. Dostępnych jest wiele opcji edycji, ale w przypadku konwencjonalnych aplikacji tylko kilka z nich jest powszechnie stosowanych.
Format modułu ładującego zawiera początkowy „zapis tekstowy”, po którym bezpośrednio następuje „rekord relokacji i / lub kontroli” dla tego rekordu tekstowego, po którym następuje więcej wystąpień zapisu tekstowego i par rekordów relokacji i / lub kontroli, aż do końca moduł.
Rekordy tekstowe są zwykle bardzo duże; rekordy relokacji i / lub kontroli są małe, ponieważ trzy bufory rekordów relokacji i / lub kontroli IEWFETCH są ustalone na 260 bajtów (mniejsze rekordy relokacji i / lub kontroli są z pewnością możliwe, ale 260 bajtów to maksimum możliwe, a IEWL zapewnia, że to ograniczenie jest przestrzegana, poprzez wstawienie dodatkowych zapisów dotyczących relokacji, jeśli to konieczne, przed następnym zapisem tekstowym, jeśli to konieczne; w tym szczególnym przypadku sekwencją rekordów może być: ..., zapis tekstowy, rekord relokacji, ..., rekord kontroli , zapis tekstowy, ...).
Specjalny bajt w buforze relokacji i / lub rekordu sterowania jest używany jako obszar komunikacyjny z „wyłączonym obróceniem bitów” i jest inicjowany na unikalną wartość. Odczyt CCW dla tego rekordu relokacji i / lub sterowania ma ustawiony bit przerwania sterowanego programem. Procesor jest w ten sposób powiadamiany, gdy kanał uzyskał dostęp do tego CCW przez specjalne wyjście IOS . W tym momencie procesor wchodzi w pętlę „wyłączonego kręcenia bitów” (czasami nazywaną „najkrótszą pętlą na świecie”). Gdy ten bajt zmieni swoją zainicjowaną wartość, CPU wychodzi z obrotu bitów i następuje relokacja podczas "przerwy" w mediach między relokacją i / lub rekordem sterującym a następnym rekordem tekstowym. Jeśli relokacja zostanie zakończona przed następnym rekordem, NOP CCW następujący po odczycie zostanie zmieniony na TIC, a ładowanie i przemieszczanie będzie kontynuowane przy użyciu następnego bufora; jeśli nie, to kanał zatrzyma się na NOP CCW, dopóki nie zostanie ponownie uruchomiony przez IEWFETCH poprzez inne specjalne wyjście IOS. Trzy bufory znajdują się w ciągłej cyklicznej kolejce, z których każdy wskazuje następny, a ostatni wskazuje pierwszy, a trzy bufory są stale ponownie wykorzystywane podczas ładowania i przemieszczania.
IEWFETCH może w ten sposób załadować i przenieść moduł ładujący o dowolnym praktycznym rozmiarze w jak najkrótszym czasie.
Dynamiczne linkery
Programy ładujące z dynamicznym łączeniem to inny typ programów ładujących, które ładują i łączą biblioteki współdzielone (takie jak pliki .so , .dll lub .dylib) z już załadowanymi uruchomionymi programami.
Zobacz też
- Skompiluj i uruchom system
- Piekło DLL
- Wiązanie bezpośrednie
- Dynamiczne wiązanie (przetwarzanie)
- Dynamiczna eliminacja martwego kodu
- Dynamiczna wysyłka
- Biblioteka dynamiczna
- Dynamiczny linker
- Dynamiczne ładowanie
- Biblioteka linków dynamicznych
- Linker GNU
- Biblioteka (informatyka)
- Linker (przetwarzanie)
- Dekoracja nazwy
- Wstępne wiązanie
- Prelinkowanie
- Relokacja (informatyka)
- Tabela relokacji
- Shebang (Unix)
- Biblioteka statyczna
- złoto (łącznik)
- prelink
- Zgodność z błędami