Linker & Loader in .NET

Download Report

Transcript Linker & Loader in .NET

Linker & Loader in .NET
August Steinbacher
Vortragsüberblick
C++ vs .NET
 Auffinden von Assemblies
 Execution Model
 Runtime Layout
 Methodenadressierung

Traditioneller Ansatz

Compiler Frontend:




App2.cpp
Incl.h
Compiler
Zwischencode -> Native Code
Platzhalter für imports & exports
Objekt
datei
Objekt
datei
Linker:


Parsen der High-Level-Syntax
Kompilieren in Zwischencode
Compiler Backend:


App1.cpp
Erzeugen eines
executable file
Loader:

EXE
Datei
Platzieren des Executables
im Speicher
Loader
Linker
Image
in MEM
.NET Modell

Compiler Frontend:


Source
Parsen der High-Level-Syntax
Erzeugen von Zwischencode
+ Metadaten
Source
Compiler
• Assemblies

Compiler Backend (CLR):


Assemblies
Lokalisieren des Assemblies
Erzeugen von Native Code
• Kompilieren
• Linken
• Laden
CLR
Processes
Memory
Ausführen von .NET

.exe Datei starten



Windows-loader startet die CLR
Applikation läuft innerhalb der CLR
Applikationsdomäne

Isoliert Applikationen voneinander
• Laden aller Assemblies, Module und Typen
• Methodentabellen der Typen
• Statische Felder und Objekte


Side-by-Side Execution
Eintrittspunkt

Schlüsselwort .entrypoint in PE-Datei
3 Levels of Loading

Laden der PE-Datei von Disk



PE-Datei
Laden des Assemblies



Einziger Festplattenzugriff
Enthält Metadaten
Aufgrund der Metadaten
Sicherheitsmanager prüft Rechte
Assemblies
Laden der Typen

Classloader
String
Integer
Object
Lokalisieren von Assemblies

Assembly Resolver





Öffentliche Assemblies



Name des gesuchten Assemblies
Versionsinformation
Informationen über AppDomain
Konfigurationsdateien
GAC
Codebase-Hints in Konfigurationsdateien
Private Assemblies


Im Applikationsverzeichnis
Probing
Lokalisieren von Assemblies
Assembly.Load(name)
N
Public Key?
J
J
In GAC?
Lade File aus GAC
N
<CodeBase>
Vorhanden?
J
J
Lade File von
<CodeBase>
N
N
Probing
erfolgreich?
N
Passt File?
J
Passt File?
N
Assembly.Load endet mit Fehler
J
Lade File
Probing

4 Kriterien:




Applikationsverzeichnis
Culture-Attribut
Assembly Name
Relativer Suchpfad
[AppDir] / [Assembly name].dll
[AppDir]/ /[Assembly
[culture] /name]
[Assembly
name].dll
[AppDir]
/ [Assembly
name].dll
[AppDir]
/
[binpath]
/
[Assembly
name].dll
[AppDir]
/
[culture]
/
[Assembly
name]
/
[Assembly
name].dll
[AppDir]/ /[binpath]
[binpath]/ /[Assembly
[culture] /name]
[Assembly
name].dll
[AppDir]
/ [Assembly
name].dll
C:/App/code.dll
[AppDir] / [binpath] / [culture] / [Assembly name] / [Assembly name].dll
C:/App/en-US/code.dll
C:/App/code/code.dll
C:/App/shared/code.dll
C:/App/en-US/code/code.dll
C:/App/shared/en-US/code.dll
C:/App/shared/code/code.dll
C:/App/shared/en-US/code/code.dll
Laden eines Typs T

Durch Classloader




Bestimmung des benötigten Speicherplatzes
Bestimmung des Speicherlayouts
Auflösen von Referenzen auf bereits geladene
Typen
Stubs erzeugen für Methoden von T
• Methodenaufrufe lösen JIT-Kompilierung aus

Verifikation der Typsicherheit

4 Kategorien
•
•
•
•
Ungültig
Gültig
Typsicher
Verifizierbar
Ungültig
Verifizierbar
Typsicher
Gültig
Execution Model
Source
Code
Policy
Compiler
csc, jsc,...
Policy
Manager
Assembly Info
Class List
Assembly
Loader
PE
Verifikation
GAC
AppDir
Assembly
Erteilte
Rechte
Class
Class
Loader
Assembly
PE File + MSIL
+ Metadaten
Runtime
Layout
Method
JIT
Native Code
Objektinstanzen
Instance of
A
Heap
Private EE
Memory
Instance
Data
Method
Table A
Instance of
B
Instance
Data
Method
Table B
Instance of
A
Instance
Data
Sync Block
Table
Runtime Layout
Object Reference
Index
Object
Header
Instance
Data
Sync Block
Table
GCDesc
Module
Interface
map
MethodTable
JMI thunk
„Hot Data“
Class
Loader
„Cold Data“
Assembly
App
Domain
EEClass
Prestub ptr
Prestub ptr
MethodDesc
MethodDesc
FieldDesc
Prestub
Compiled
method
Method Table & Interface Map
Method Table
GCDesc
Interface Map
1
2
EEClass
MethodTable
header
3
Inherited
virtuals
5
Introduced
virtuals
Instance and
static
methods
4
Methodenadressierung
interface I1 { m1(); m2(); }
class A : I1 { m1(){..};
m2(){..}; }
class B : A, I2 {m3(){..}; }
class C : B { I2.m2() {..}; }
A.m1; I1.m1
A.m2; I1.m2
A.m1; I1.m1;
A.m2; I1.m2; I2.m2
B.m3;
I2.m3
A.m1; I1.m1;
A.m2; I1.m2;
B.m3;
I2.m2;
I2.m3;
Method Implementations
interface I2 { m2(); m3(); }
Quellen

Don Box, Chris Sells: Essential .NET, The Common
Language Runtime, Addison-Wesley 2003

Dave Stutz, Ted Neward, Geoff Shilling: Shared Source
CLI Essentials. O'Reilly 2003

W.Beer, D.Birngruber, H.Mössenböck, A.Wöß: Die .NETTechnologie, dpunkt.verlag 2002

http://www.msdn.microsoft.com/netframework/

http://www.dotnetframework.de

http://dotnet.di.unipi.it/
Ende...
...Fragen?