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ą:

  1. walidacja (uprawnienia, wymagania dotyczące pamięci itp.);
  2. kopiowanie obrazu programu z dysku do pamięci głównej ;
  3. kopiowanie argumentów wiersza poleceń na stos ;
  4. inicjalizacja rejestrów (np. wskaźnik stosu);
  5. 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:

  1. inicjalizacja struktur w samej bibliotece DLL (tj. sekcje krytyczne , listy modułów);
  2. walidacja pliku wykonywalnego do załadowania;
  3. tworzenie sterty (poprzez funkcję RtlCreateHeap );
  4. alokacja bloku zmiennych środowiskowych i bloku PATH;
  5. dodanie pliku wykonywalnego i NTDLL do listy modułów (lista podwójnie połączona );
  6. ładowanie KERNEL32.DLL w celu uzyskania kilku ważnych funkcji, na przykład BaseThreadInitThunk ;
  7. ładowanie importów plików wykonywalnych (tj. bibliotek z łączem dynamicznym ) rekurencyjnie (sprawdź importy importów, ich importy itd.);
  8. w trybie debugowania, podniesienie punktu przerwania systemu;
  9. inicjalizacja bibliotek DLL;
  10. zbieranie śmieci;
  11. wywołanie NtContinue parametru kontekstu przekazanego funkcji ładującej (tj. skoku do RtlUserThreadStart , 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ż

Bibliografia