2017-04-11 1 views

Antwort

0

Es gibt positionsunabhängigen Code und positionsabhängigen Code. Positionsunabhängiger Code hängt nicht davon ab, wo er sich im Speicher befindet. Positionsunabhängiger Code ist im Allgemeinen wünschenswert. Es gibt viele Techniken, die Prozessor/Compiler-Assembler/Linker/Loader-Kombinationen verwenden, um positionsunabhängigen Code zu erzeugen.

Wenn Sie etwas tun:

extern int b ; 
int a = &b; 

der Code von Natur aus nicht unabhängig positionieren, da die Zuordnung hängt davon ab, wo b ist (jedoch geladen worden ist, tritt diese Situation so häufig, dass Linker und Lader haben Weisen damit umgehen).

Wenn ein Programm oder eine gemeinsam genutzte Bibliothek nur positionsunabhängigen Code enthält, kann sie überall im Speicher geladen und verschoben werden.

Angenommen, Sie haben ein Programm P, das mit den gemeinsam genutzten Bibliotheken L1 und L2 verknüpft ist. Wenn L1 und L2 denselben Speicherplatz im Speicher benötigen, können sie nicht zusammen geladen werden und P kann nicht ausgeführt werden.

0

Die meisten Programme können verschoben werden. Wenn das Programm relative Adressen seiner Daten enthält, kann es irgendwo im Speicher abgelegt werden. Enthält es absolute Adressen, passt der Lader diese Adressen im Code an, wenn das Programm in den Speicher geladen wird. http://linker.iecc.com/

+0

Ihre Erklärung ist gut :). Sie erklären jedoch, wie alle Programme verschoben werden können? Was meinst du mit – Mikeez

+0

Ja. Alle normalen Programme können verschoben werden. In vielen Fällen wird das Programm jedoch nicht verlagert, aber das Betriebssystem verwendet die virtuelle Adressübersetzung, um das Programm an die virtuelle Adresse zu platzieren, die es wünscht, selbst wenn die physikalische Adresse irgendwo anders ist. Die Verlagerung ist erforderlich, wenn derselbe Prozess mehrere Programme, DLLs oder gemeinsam genutzte Objekte aufweist, da sie auch unterschiedliche virtuelle Adressen aufweisen müssen. –

+0

Vielen Dank Ein Nebel :) – Mikeez