Kapitel 19 Der Ladezyklus

Kapitel 19 Der Ladezyklus Ali Jannessari IPD Tichy – Lehrstuhl für Programmiersysteme KIT – die Kooperation von Forschungszentrum Karlsruhe GmbH und...
4 downloads 1 Views 1MB Size
Kapitel 19 Der Ladezyklus Ali Jannessari

IPD Tichy – Lehrstuhl für Programmiersysteme

KIT – die Kooperation von Forschungszentrum Karlsruhe GmbH und Universität Karlsruhe (TH)

Assemblies 1 .NET-Modul = 1 .NET-PE-Datei (kann von WindowsLader direkt geladen werden). Aufbau einer .NET-PE-Datei (Portabel Executable): PE/COFF Headers

CLR Header

CLR Data Metadaten CIL (Code)

PE/COFF (Portable Executable/Common Object File Format) Kleines Programm für die Mitteilung an den DOS-Benutzer, dass diese Datei unter DOS nicht ausführbar ist (Wie Windows-PEDatei). 1

Kapitel 19 - Der Ladezyklus

Assemblies

PE/COFF Headers

CLR Header

CLR Data Metadaten CIL (Code)

CLR-Header, enthält: Versionsnummer der CLR Die Größe und Positionen einiger Metadaten-Tabellen Name der Methode, mit welcher die Ausführung beginnen soll (im Falle einer ausführbaren Datei)

Bei anderen Betriebssystemen muss die CLR explizit gestartet werden, um eine .NET-Applikation ausführen zu können (Portable): SSCLI (Rotor): clix Helloworld (clix ist das CLR-Program) Mono: mono Helloworld 2

Kapitel 19 - Der Ladezyklus

Assemblies Ein Modul allein ohne Manifest (spezielle Metainformationen) kann nicht direkt von CLR verwendet werden. Ein Assembly ist ein Container für verwaltete Module mit speziellen Metainformationen (Assembly = Modul + Manifest) Einheit für Auslieferung, Kapselung, Laden, Versionierung und Sicherheit (als EXE oder DLL) Einzel-Datei Assembly und Multi-Datei Assemblies

3

Kapitel 19 - Der Ladezyklus

Assemblies Multi-Datei Assemblies Das Primär-Modul verweist auf andere Module und Ressourcendateien enthält das Manifest und den Eintrittspunkt (.entrypoint)

Der Name einer Assembly ist der Name des Primär-Moduls

4

Kapitel 19 - Der Ladezyklus

Beispiel Assembly SFA (Einzel-Datei): .module SFA.exe

PE-Datei

CLR Header Manifest Ressource (z.B. ein Bild)

CIL-Code Typ 1

Typ 2

Typ 3

Ressource (z.B. ein Video)

Metadaten Typ 1

Typ 2

Typ 3

Im Manifest stehen die Informationen, die nötig sind, um alle Definitionen eines Assemblies zu finden

5

Kapitel 19 - Der Ladezyklus

Manifest Nur das Primär-Modul enthält die Assembly-Tabelle, die das Assembly identifiziert (und wird zuerst von CLR geladen) : Assembly

.assembly

0x20

Name des Assemblies (ohne Dateierweiterung, ohne Pfade) Version: Major.Minor.Build.Revision (je 2 Byte ) Sprache (Landes- und Sprachinformation) Hashalgorithmus: None, MD5,.. Attribute: None, SideByside,… Rechte, die zur Ausführung des Assemblies notwendig sind Publik Key File

.file

0x26

File-Tabelle: Liste aller Dateien (ohne PE-Datei des PrimärModuls), die zur Assembly gehören (IL-Tag: .file, TokenByte=0x26) 6

Kapitel 19 - Der Ladezyklus

Manifest Exported-Type-Tabelle: Typen, die in den anderen Modulen des Assemblies (nicht in Primär-Modul) definiert sind und außerhalb des Assemblies sichtbar sein sollen. ExportedType

.class extern

Namensraum und Name des Typs, Attribute (Sichtbarkeit, Layout, …) Verweis auf Implementierung und ...

7

Kapitel 19 - Der Ladezyklus

0x27

Multi-Datei Assemblies Wann? Wenn die einzelnen Module in verschiedenen Sprachen geschrieben wurden Wenn man vermeiden will, dass alle Teile einer Anwendung auf einmal geladen werden (z.B. verteilte Anwendungen)

8

Kapitel 19 - Der Ladezyklus

Beispiel: Multi-Datei Assemblies csc /target:module /out:priv.mod PrivateType.cs csc /target:module /out:pub.mod /addmodule:priv.mod PublicType.cs csc /addmodule:priv.mod,pub.mod MFAAPP.cs .Datei MFAAPP.exe .module MFAAPP.exe Manifest .assembly MFAAPP .file pub.mod .file priv.mod .class extern public PublicType

Metadaten .assembly extern mscorlib .module extern pub.mod .module extern priv.mod .class public App

CIL-Code 9

Kapitel 19 - Der Ladezyklus

.Datei pub.mod .module pub.mod Metadaten .assembly extern mscorlib .module extern priv.mod .class public PublicType

CIL-Code .Datei priv.mod .module priv.mod Metadaten .assembly extern mscorlib .class private PrivateType

CIL-Code

Zugriff auf exportierten Typ .Datei MFAAPP.exe

.Datei OtherApp.exe

.module MFAAPP.exe

.module otherApp.exe

Manifest

Manifest

.assembly MFAAPP .file pub.mod .file priv.mod .class extern public PublicType

.assembly OtherApp

Metadaten .assembly extern mscorlib .assembly extern MFAAPP .class public App

CIL-Code

2

1 3

pub.mod laden 4

Metadaten .assembly extern mscorlib .module extern pub.mod .module extern priv.mod .class public App

CIL-Code

Durch diese Informationen im Manifest wird das Assembly unabhängig Zero-Impact-Installation: Programminstallation ohne jede Nebenwirkungen 10

Kapitel 19 - Der Ladezyklus

Kapselung Ein Assembly bildet eine Kapsel um alle beteiligten Elemente und regelt damit: Sichtbarkeit (visibility): Welche Typen außerhalb des Assemblies sichtbar sind (Schlüsselwort privat: unsichtbar, Schlüsselwort public: sichtbar) Zugriffsrechte (accessibility): Von wo aus auf welche Komponenten zugegriffen werden darf private: innerhalb desselben Typs family: innerhalb desselben oder eines davon abgeleiteten Typs assembly: innerhalb desselben Assemblies famandassem: innerhalb desselben Typs und innerhalb eines von diesem abgeleiteten Typs desselben assemblies famorassem: innerhalb desselben oder eines davon abgeleiteten Typs oder innerhalb desselben Assemblies public: an beliebiger Stelle

11

Kapitel 19 - Der Ladezyklus

Private Assemblies Nur innerhalb eines Anwendungsverzeichnisses bekannt Wird nur von einer einzigen Anwendung verwendet Verschiedene Versionen liegen in unterschiedlichen Verzeichnissen Hat keinen „starken Namen“ (später) und identifiziert anhand eines einfachen Namens, z.B. “Stringer” Keine Versionsüberprüfung Kann nicht signiert werden Installation per Dateikopie Standardmäßig befinden sich Assembly und Anwendung im gleichen Verzeichnis Verzeichnis kann per .config-Datei definiert werden 12

Kapitel 19 - Der Ladezyklus

Private Assemblies Bibliotheken (DLLs) werden in folgenden Verzeichnissen gesucht: im Anwendungsverzeichnis in allen Verzeichnissen, die in einer eventuell vorhandenen Konfigurationsdatei (z.B. MyApp.exe.config) unter dem Tag angegeben sind: … … Vollständiger Quellcode: „Demo 5“ Kapitel 19 - Der Ladezyklus

Öffentliche (Shared) Assemblies können von allen Anwendungen benutzt werden stehen in einem systemweiten Repository: Global Assembly Cache (GAC) GAC kann gleichnamige Assemblies mit unterschiedlichen Versionsnummern enthalten  Side by Side Execution müssen durch einen starken Namen (strong name) identifiziert werden Können signiert werden Versionsüberprüfung durch die CLR

14

Kapitel 19 - Der Ladezyklus

Öffentliche (Shared) Assemblies Installation im Global Assembly Cache (GAC) mit SDK-Tools: al.exe oder gacutil.exe systemweiter „Speicherbereich“ normale Dateien keine Registry-Einträge, o. ä.

Friend Assemblies: nicht öffentlichen Typen einer Assembly für ausgewählte Assemblies sichtbar machen eine befreundete Assembly wird durch InternalvisibleTo deklariert using System;

// internal types & members visible to // the assembly called cs_friend_assemblies_2 [assembly:InternalsVisibleTo("cs_friend_assemblies_2")] class Class1 { ... } 15

Kapitel 19 - Der Ladezyklus

Starker Name (Strong Name) Manifest enthält einen starken Namen, der das Assembly eindeutig identifiziert Bestehen aus 4 Teilen: Name, Versionsnummer, Kultur und öffentlichem Schlüssel (public key) des Assemblies Der Name des Assemblies (z.B. A.dll, gleich wie name der PE-Datei) Die Versionsnummer des Assemblys: Major.Minor.Build.Revision (z.B. 1.0.1033.17) Im Quellcode: System.Reflection.AssemblyVersionAttribute festlegen oder per Assembly Linker (al.exe) Standardwert 0 für nicht angegebene Werte Build und Revision können im AssemblyVersion-Attribut durch * spezifiziert werden: [assembly:AssemblyVersion("1.2.*")] Der Compiler setzt dann passende Werte ein: Build: Anzahl der Tage seit 1.1.2000 Revision: Anzahl der Sekunden seit Mitternacht (Ortszeit) dividiert durch 2

16

Kapitel 19 - Der Ladezyklus

Starker Name (Strong Name) Die Kultur (culture) des Assemblies: Sprach und länderspezifische Information standardwert: Neutral durch System.Globalization.CultureInfo oder Al.exe festlegen

Der öffentliche Schlüssel (public key) des Assemblies identifiziert den Produzenten 128 Byte (1024 Bit) lang Für Referenzen auf Assemblies mit starken Namen verwendet man eine verkürze Version (Hashwert) von 8 Byte (64 Bit) = Public Key Token

Beispiele: MyAssembly, Version= 1.2.745.18000, Culture=en-Us, PublickeyToken=13a3f300fff94cef

AnotherAssembly, Version= 0.0.0.0, Culture=neutral, PublickeyToken=null

17

Kapitel 19 - Der Ladezyklus

Versionierung Aufbau der Versionsnummer:

Inkompatibel: Eine öffentliche Assembly ist grundsätzlich inkompatibel zum Klienten, wenn sich die Major- oder Minor-Version ändert Beispiel: neues Produktrelease Inkompatibel: Runtime wirft eine Type Load Exception

18

Kapitel 19 - Der Ladezyklus

Versionierung Vielleicht kompatibel: Ein öffentliches Assembly kann kompatibel zum Klienten sein, wenn sich die Build- bei gleich bleibender Major- und Minorversion ändert Beispiel: Servicepack

Runtime versucht, das Assembly mit der höchsten Revisions- und Buildnummer zu laden

QFE – Quick Fix Engineering: Ein öffentliches Assembly ist grundsätzlich kompatibel zum Klienten, wenn sich nur die Revision ändert In diesem Fall liegt ein so genannter Quick Fix Engineering (QFE) vor Beispiel: Security Hotfix

Runtime versucht, das Assembly mit der höchsten Revisions- und Buildnummer zu laden 19

Kapitel 19 - Der Ladezyklus

Versionierung Klient wird standardmäßig an die Version des öffentlichen Assemblies gebunden, die in seinem Manifest eingetragen ist. Dieses Verhalten kann per .config-Datei überschrieben werden

20

Kapitel 19 - Der Ladezyklus

Versionierung Es werden jene Bibliotheken geladen, die der erwarteten Versionsnummer entsprechen: Versionsnummer wird bei der Übersetzung gespeichert class A {...}

csc /t:library A.cs

A.dll (V 1.2.3.4)

class B { A a = new A(); ... }

csc /r:A.dll B.cs

B.exe merkt sich Versionsnummer von A.dll (V 1.2.3.4)

Versionsnummer wird beim Laden geprüft Aufruf: B

21

Kapitel 19 - Der Ladezyklus

● lädt B.exe ● findet darin Bezug auf A.dll (V 1.2.3.4) ● lädt A.dll in Version V 1.2.3.4 (auch wenn es andere Versionen von A.dll gibt)

Versionierung

Versionierung und öffentliche Assembly Vorgaben per .config-Datei definieren Option bindingRedirect – Klient soll eine ganz bestimmte Version eines Assemblies laden Name: Name des Assemblies Originator: Public Key des Assemblies, um Eindeutigkeit zu gewährleisten oldVersion: Version, die nicht geladen werden sollen (ein Stern kennzeichnet alle Versionen) newVersion: Version des Assemblies, das geladen werden soll

Vollständiger Quellcode: „Demo 6“ 22

Kapitel 19 - Der Ladezyklus

Virtuelles Ausführungssystem (VES) Bestimmung der Version der CLR Jede .NET-Applikation entspricht dem Windows-PE-Dateiformat (unter Windows) „mscoree.dll“ ist wie eine kleine zentrale Schaltstelle zur Bestimmung die Version der CLR Die Funktion „_CoreExeMain“ aus „mscoree.dll“ wird von WindowsLader (außerhalb der CLR) aufgerufen Die richtige Version der CLR wird von Windows-Lader zur Ausführung der .NET-Applikation festgelegt Alles weitere ist dann die Sache der CLR

23

Kapitel 19 - Der Ladezyklus

Virtuelles Ausführungssystem (VES) Kontrolle und Ausführung unter CLR CLR muss den Eintrittspunkt ins Programm finden der Primär-Modul mit der Main-Methode (Schlüsselwort: .entrypoint)

Erste Aufgabe der Execution Engine Laden einer PE-Datei Die Name der Main-Methode ist im CLR-Header der PE-Datei angegebn

Metadaten Module (.Net-PE-Datei)

Zweite Aufgabe der Execution Engine

CIL

Laden eines Assembly Die zuständige Applikationsdomäne erzeugt ein Assembly-Objekt

Execution Engine Laden einer PE-Datei

AppDomain Laden eines Assemblies

24

Kapitel 19 - Der Ladezyklus

Virtuelles Ausführungssystem - Aufgaben Typsicherheit Speicherverwaltung (Speicherlayout, GC, …) JIT-Compilation Ausnahmebehandlung Maschinencode, GC- & EH-Tabellen Sicherheit Verifizierer + JIT-Compiler

AppDomain

Assemblyinfo: Modul- & Typliste

Sicherheits -politik

25

Kapitel 19 - Der Ladezyklus

Typinfo, Methodentabellen

Sicherheitsmanager

Assemblyrechte

Klassenlader

Applikationsdomänen (AppDomains) sind isolierte Bereiche im CLR-Prozess (= BS-Prozess) (leichtgewichtige Unterprozesse, aber ungleich Threads) Thread A Thread B Thread C AppDomain 1

AppDomain 2

AppDomain 3

schirmen Applikationen gegeneinander ab können individuell geschützt und konfiguriert werden umfassen (und isolieren) Assemblies, Module und Typen einer Applikation (logische Container) Methodentabellen der geladenen Typen statische Felder und Objekte der geladenen Typen 26

Kapitel 19 - Der Ladezyklus

Applikationsdomänen Mechanismus dass in einem Prozess mehrere Applikationen laufen lassen. ohne sich gegenseitig beeinflussen

Es wird immer die Standard-Applikationsdomäne angelegt. Zusätzliche Applikationsdomänen können entweder direkt im Code (System.AppDomain.CreateDomain) oder vom jeweiligen Host der CLR erzeugt werden. Applikationsdomänen können auch entladen werden, ohne die CLR zu beenden.

27

Kapitel 19 - Der Ladezyklus

Applikationsdomänen Pro CLR-Prozess gibt es einen domäneneutrale Bereich, der von allen Applikationsdomänen erreichbar ist. Die domäneneutrale Bereich enthält die Assemblies und Typen, die von alle Applikationsdomänen gemeinsam benutzt werden. Assemblies die von mehreren Applikationen verwendet werden, werden in jeder Applikationsdomäne unabhängig voneinander geladen. Typen und statische Felder usw. werden einmal pro Applikationsdomäne angelegt. 28

Kapitel 19 - Der Ladezyklus

Beispiel: Applikationsdomänen Mehrere Applikationen in einem Prozess ohne sich gegenseitig beeinflussen: Default-AppDomain

AppDomain 2

Assemblies & Module

Assemblies & Module

view.exe

System.Windows.Forms.dll

gui.dll bar.mod

System.Drawing.dll System.dll

App2.exe

System.dll

System.Windows.Forms.dll

Typen & Methoden Typen & Methoden BarChartApp

BarChartGui

BarChartControl System.Windows.Forms.UserControl

SSW.MyControl SSW.App2 System.Windows.Forms.UserControl

domänen-neutraler Bereich Assemblies & Module mscorlib.dll

Typen & Methoden System.Object

System.Int32

Execution Engine, Heap, Thread-Pool, ... Windows-Prozess 29

Kapitel 19 - Der Ladezyklus

Auffinden eines Assemblies (Assembly Resolver) Beim Laden eines unbekannten Assemblys: Name des gesuchten Assemblys Versionsinformationen, die beim Übersetzer festgelegt werden Informationen über die Applikationsdomäne, die das Assembly laden will Information aus diversen Konfigurationsdateien

Strategie für private Assemblies: im Verzeichnis der jeweiligen Applikation und Probing

30

Kapitel 19 - Der Ladezyklus

Auffinden eines Assemblies (Assembly Resolver) Probing verwendet folgende Informationen: Das Basisverzeichnis der Applikation, die ein Assembly laden will (System.AppDomain.BaseDirectory) Die Sprache (Culture) des Assemblies (Falls vorhanden) Den Namen des zu ladenden Assemblies Den Privaten Suchpfad der Applikation (System.AppDomain.RelativeSerachPath oder in der AnwendungsKonfigurationsdatei oder direkt im Code)

31

Kapitel 19 - Der Ladezyklus

Auffinden eines Assemblies Strategie für Öffentliche (Shared) Assemblies: (1)

Bestimmen der zu ladenden Version des Assemblies

(2)

Falls die gefundene Version schon geladen wurde, wird diese verwendet

(3)

Ist sie noch nicht geladen, wird sie zuerst im GAC gesucht

(4)

Wurde das Assembly im GAC nicht gefunden: Falls in einer Konfigurationsdatei eine Codebase (URI) angegeben wurde, wird nur an dieser Stelle gesucht. Falls es dort nicht ist, wird die Suche erfolglos abgebrochen. Andernfalls setzt das Probing ein.

32

Kapitel 19 - Der Ladezyklus

Auffinden eines Assemblies Beispiel Probing auf MyAssembly : MyAssembly, Version= 1.2.0. 0, Culture=neutral, PublickeyToken=13a3f300fff94cef Basisverzeischnis der Applikation: http:// ipd.ira.uka.de/

Privater Suchpfad: bin

33

Kapitel 19 - Der Ladezyklus

Beispiel: Probing Probing auf MyAssembly : Folgende URIs in der anegebenen Reihenfolge: http:// ipd.ira.uka.de/ MyAssembly.dll http:// ipd.ira.uka.de/ MyAssembly / MyAssembly.dll http:// ipd.ira.uka.de/ bin / MyAssembly.dll http:// ipd.ira.uka.de/ bin / MyAssembly / MyAssembly.dll http:// ipd.ira.uka.de/ MyAssembly.exe http:// ipd.ira.uka.de/ MyAssembly / MyAssembly.exe http:// ipd.ira.uka.de/ bin / MyAssembly.exe http:// ipd.ira.uka.de/ bin / MyAssembly / MyAssembly.exe

Probing mit Sprachmerkmal Culture=de-de http:// ipd.ira.uka.de/ de-de / MyAssembly.dll http:// ipd.ira.uka.de/ de-de / MyAssembly / MyAssembly.dll http:// ipd.ira.uka.de/ bin / de-de / MyAssembly.dll usw. 34

Kapitel 19 - Der Ladezyklus

Klassenlader Metadaten Module (.Net-PE-Datei) CIL Execution Engine Laden einer PE-Datei

AppDomain Laden eines Assemblies

Sicherheitsmanager Rechtevergabe

Klassenlader Laden eines Moduls

Laden eines Typs

35

Kapitel 19 - Der Ladezyklus

Klassenlader Die CLR hat nur einen Klassenlader (keinen benutzerdefinierten Klassenlader wie in Java) Metadaten eines Assemblies werden vor allem betrachtet (für Typsicherheit und Konsistenzprüfungen) Laden eines Typs T (1) (2) (3)

Bestimmung des für Objekte von T benötigten Speicherplatzes Bestimmung des Speicherlayouts für T-Objekte Auflösung aller Referenzen von T auf bereits geladene Typen Die konsistente Verwendung der Referenzen wird überprüft Namentliche Referenzen werden in direkte Verweise umgewandelt

36

Kapitel 19 - Der Ladezyklus

Klassenlader Laden eines Typs T (fortgesetzt) (4)

(5)

Prüfung der Konsistenz aller Referenzen von bereits geladene Typen auf T Referenzen von T auf noch nicht geladene Typen werden: Durch sofortiges Laden der referenzierten Typen aufgelöst, oder Nur registriert und ihre Konsistenz beim späteren Laden des referenzierten Typs geprüft

(6)

Erzeugung von Stummeln für alle implementierten Methode von T, die beim ersten Aufruf der Methode die JIT-Übersetzung des CIL-Codes auslösen

Sobald der Typ T geladen wurde, lassen sich Objekte davon erzeugen und seine Elemente verwenden.

37

Kapitel 19 - Der Ladezyklus

Klassenlader Die Konsistenzprüfungen der Klassenlader sind minimale Tests, die durchgeführt werden müssen. Der Verifizierer ist für die formale Prüfung der Typsicherheit (Verifikation) zuständig.

Notwendige Prüfung für die Typsicherheit durch den Klassenlader Alle Eingangswerte müssen die vorgeschriebene Typsignatur aufweisen Typsignaturen aller Methoden und Feldern müssen mit deren Implementierung übereinstimmen

Vermeidung von Pufferüberläufen z.B: verwendete String-konstanten in den vorgesehenen Puffern Platz haben

Ob die verwendeten Metadaten-Tokens auch korrekt in die entsprechenden Tabellen verweisen Usw. 38

Kapitel 19 - Der Ladezyklus

Klassenlader Viele diese Prüfungen werden auch durch den Übersetzer durchgeführt, aber Es ist nicht bekannt mit welchem Compiler das zu ladende Assembly erzeugt wurde also muss der Lader zur Laufzeit noch einmal prüfen.

39

Kapitel 19 - Der Ladezyklus

Verifizierer Execution Engine Laden einer PE-Datei

AppDomain Laden eines Assemblies

Sicherheitsmanager Rechtevergabe

Klassenlader Laden eines Moduls Laden eines Typs

JIT-Compiler Verifikation der CIL

Übersetzung in Maschinencode

40

Kapitel 19 - Der Ladezyklus

Verifizierer Die Verifizierer ist für formale Prüfung der Typsicherheit (Verifikation) eines Programms vor seiner Übersetzung in Maschinencode zuständig Verifikation ist optional ein hohes Maß an Sicherheit

Typsichere Programme greifen nur auf Speicherbereiche die tatsächlich für sie eingerichtet werden Objekte werden nur über ihre Schnittstelle verwenden Objekte in eine gemeinsame Addressraum zu halten  keine etwaige Sicherheitsprüfungen

41

Kapitel 19 - Der Ladezyklus

Verifizierer Verifizierer ist ein Teil des JIT-Übersetzers und daher wird auch nur für einzelne Methoden aufgerufen, ohne den Kontext dieser Aufruf zu kennen Die Verifizierer untersucht den CIL-Code und nimmt eine Kontrollflussanalyse mit Hilfe der Typinformationen vor, um zu zeigen, dass: der Code typsicher ist, falls die Typinformationen korrekt sind und die Implementierung die Korrektheit der Typinformation garantiert.

42

Kapitel 19 - Der Ladezyklus

Verifizierer Der CIL-Code wird durch den Verifizierer in vier Kategorien eingeteilt: Ungültig Syntax entspricht nicht dem CIL-Format oder enthält undefinierte Befehlcodes Keinen Maschinencode von JIT-Compiler wird erzeugt

Gültig Syntax entspricht dem CIL-Format Enthält Anweisungen, die nicht Typsicher sind (z.B. Zeigerarithmetik) Maschinencode lässt sich erzeugen

43

Kapitel 19 - Der Ladezyklus

Verifizierer Typsicher Untermenge der gültigen Kategorie Alle Anweisungen halten sich streng an die Verträge, die die referenzierten Typen implementieren

Verifizierbar Eine echte Teilmenge der letzten Kategorie (Typsicher) Es kann bewiesen werden, dass CIL-Code typsicher ist. Es ist nicht möglich alle typsicheren Programme zu verifizieren.

44

Kapitel 19 - Der Ladezyklus

JIT-Compiler (Jitter im VES) Die Übersetzung von Programmcode ist dynamisch: Jede Methode wird erst dann übersetzt, wenn sie zum ersten Mal aufgerufen wird.

JIT-Übersetzung (JITten im VES) Ein Methodenaufruf erreicht zuerst den Stummel erzeugt von Klassenlader. Stummel enthält Informationen über den JIT-Status der Methode ob sie bereits in Maschinencode übersetzt wurde oder nicht

Falls der JIT-Status zeigt, dass kein Maschinencode für die Methode vorliegt: Der JIT-Compiler wird aktiviert und die Methode in Native Image Code übersetzt Die Informationen im Stummel wird aktualisiert 45

Kapitel 19 - Der Ladezyklus

JIT-Compiler (Jitter im VES) JIT-Übersetzung (JITten im VES) - fortgesetzt Zukünftige Aufrufe der übersetzten Methode wird den erzeugten Maschinencode ausführen. Bei einer neuerlichen Programmausführung muss wieder übersetzt werden. Mit dem ngen.exe (Native Image Generator) es ist möglich, das Programm auf einmal in Maschinencode zu übersetzen und in den Native Image Cache zu legen (Prekompilieren).

46

Kapitel 19 - Der Ladezyklus

JIT-Compiler (Jitter im VES) CLR bietet drei verschiedene Laufzeit-Übersetzer: Standard-JIT-Compiler Führt unter Berücksichtigung der aktuellen Rechnerarchitektur und Konfiguration Codeoptimierungen durch.

EconoJIT Besonderes sparsam mit Zeit und Speicherresourcen Unkomplizierte Portierung auf beliebige Plattformen wegen der Einfachheit und Sparsamkeit Erzeugter Maschinencode wird wieder weggeworfen Große CIL-Programme können mit sehr beschränktem Speicheplatz auskommen

Geeignet für eingebettete Systeme (z.B.: Mobile Gräte,…)

47

Kapitel 19 - Der Ladezyklus

JIT-Compiler (Jitter im VES) OptJIT (Keine Unterstützung vom Microsoft mehr) versteht nur eine Untermenge von CIL: „OptIL“ OptIL enthält zusätzliche Informationen, die Compiler-Optimierungen vorwegnehmen. gleichwertiges Ergebnisse wie standard-JIT und auch fast so Sparsam wie EconoJIT OptJIT setzt einen optimierende Source-to-CIL-Compiler voraus Zusatzinformationen über den Kontrollfluss, Registerallokation, etc. sind vorhanden ein Teil des JIT-Aufwands wird von der Laufzeit in die Übersetzungsezeit vorverlegt

Standardisierte Schnittstelle zwischen der CLR und JITCompiler Verwendung von benutzerimplementierten JIT-Compilern (hohe Flexibilität, möglich ab .Net 3.0) 48

Kapitel 19 - Der Ladezyklus

Execution Engine Laden einer PE-Datei

AppDomain Laden eines Assemblies

Virtuelles Ausführungssystem

(VES)

Sicherheitsmanager Rechtevergabe

Klassenlader

erste Verwendung eines noch nicht geladenen Assemblies

Laden eines Moduls

Laden eines Typs erste Verwendung eines noch nicht geladenen Typs

JIT-Compiler Verifikation der CIL

Übersetzung in Maschinencode erster Aufruf einer nicht übersetzten Methode eines geladenen Typs

Managed Native Code

Codemanager Ausführung des Programms

49

Kapitel 19 - Der Ladezyklus

Garbage Collection Exception Handling Sicherheitsprüfung

erste Verwendung eines noch nicht geladenen Moduls eines geladene Assemblies