2Binden 3. und Bibliotheken

Ähnliche Dokumente
Systemprogrammierung

Systemnahe Programmierung in C Übungen Jürgen Kleinöder, Michael Stilkerich Universität Erlangen-Nürnberg Informatik 4, 2011 U7.fm

G 5. Übung. G-1 Überblick. Besprechung 3. Aufgabe. Infos zur Aufgabe 5: fork, exec. Rechenzeiterfassung. Ü SoS I G.1

U7 POSIX-Prozesse U7 POSIX-Prozesse

Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014

K Ergänzungen zur Einführung in C

4.4 Prozesse. H. Weber, HS RM SS 2010 Systemprogrammierung Kap. 4.4 Seite 1 von 22

Übungsbesprechung Blatt 3 Vorlesung Betriebssysteme I (WS 2018/19) Operating Systems And Middleware Group

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

7 Laufzeit-Speicherverwaltung

Institut für Informatik der Ludwig-Maximilians-Universität München Systempraktikum Wintersemester 2009/2010 Prof. Dr. Dieter Kranzlmüller Dr. Thomas S

Maschinencode Dateiformat und Stackframes

Konzepte von Betriebssystem-Komponenten. Programmstart & dynamische Bibliotheken SS 05. Wladislaw Eckhardt.

Grundlagen der Informatik für Ingenieure I. 5. Prozessverwaltung - Einführung

Übungen zu Systemprogrammierung 1

Übungen zu Systemprogrammierung 1 (SP1)

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Wolfram Burgard

U23 - Shellcode. Twix Chaos Computer Club Cologne. Motivation Einstieg Der erste Shellcode Nullbytes, NOP Slides

1 pulsierender Speicher

Linux Prinzipien und Programmierung

Linker: Adreßräume verknüpfen. Informationen über einen Prozeß. Prozeß-Erzeugung: Verwandtschaft

Übungspaket 17 Der gcc Compiler

3. Unix Prozesse. Betriebssysteme Harald Kosch Seite 57

Technische Informatik 1

Übungspaket 17 Der gcc Compiler

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Programmierung mit C Zeiger

FACHHOCHSCHULE MANNHEIM

Teil 3: Konzepte von Betriebssystemen

6 Speicherorganisation

Vorlesung Programmieren

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

Homogene Multi-Core-Prozessor-Architekturen

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes

Unterlagen. CPP-Uebungen-08/

Grundlagen der Informatik 2 Modul Systemnahe Programmierung in C (SPiC) Klausur am 9. April 2008

Teil II. Literatur zur C-Programmierung:

2A Basistechniken: Lösungen 2A.1 Wissens- und Verständnisfragen

Programmierung mit C Modularisierung von Programmen. Präprozessor-Anweisungen nutzen.

Fakultät für Informatik der Technischen Universität München. Kapitel 3. Nebenläufigkeit

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

Überblick: Teil D Betriebssystemabstraktionen

Sicheres C Programmieren in Embedded Systemen ARM I (ARM7TMDI [1] ) Wintersemester

8.1 Vom Quellcode zur ausführbaren Programm

Einleitung Grundlagen Erweiterte Grundlagen Zusammenfassung Literatur. C: Funktionen. Philip Gawehn

Klausur Betriebssysteme I

C/C++-Programmierung

Eine Mini-Shell als Literate Program

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Hello World! Eine Einführung in das Programmieren Das erste Programm

Was ist ein Prozess?

Was gehört (nicht) ins SVN?

Programmierung in C: Vermischtes (Teil 1)

Betriebssysteme: UNIX-Operationen zur Prozesskontrolle

Konzepte von Betriebssystemkomponenten

Informatik II Übung 05. Benjamin Hepp 3 April 2017

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Zeiger vom Typ void* benötigen weniger Speicher als andere Zeiger, da bei anderen Zeigertypen zusätzlich die Größe gespeichert werden muss.

Exploit-Entwicklung mit Python

Technische Informatik 1 - Übung 3 3. & 4. November Philipp Miedl

Wie teuer ist dynamischer Polymorphismus? 194

6 Speicherorganisation

Klausur Betriebssysteme

System-Makro in time.h : #define CLOCKS_PER_SEC 1000 Frühere Makro-Bezeichnung (z.t. noch gebräuchlich): #define CLK_TCK CLOCKS_PER_SEC//aus:time.

d) Welche Aussage zum Thema Adressräume ist richtig?

Implementieren von Klassen

einlesen n > 0? Ausgabe Negative Zahl

Betriebssysteme I: Speicherverwaltung (Teil A: Adress-Bindung)

Betriebssysteme Kapitel E : Prozesse

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Inhalt. 4.9 Typen, Variable und Konstante

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

F Zeiger, Felder und Strukturen in C

Programm in Source-Files aufteilen Erhöht Lesbarkeit Aufteilung orientier t sich an logischer Struktur des Programms Getrenntes Übersetzen möglich:

Programmiersprachen Einführung in C

Propädeutikum. Dipl.-Inf. Frank Güttler

Klausur: Informatik I am 06. Februar 2009 Gruppe: D Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Einführung Makros Includes Errors und Warnings Pragmas Diverses. Der C-Präprozessor. Lukas Stabe. Universität Hamburg

EWS, WS 2016/17 Pfahler I-1

Software Entwicklung 1

Betriebssysteme (BS) Prozesse. Olaf Spinczyk.

Einführung. Übungen zur Vorlesung Virtuelle Maschinen. Stefan Potyra. SoSe 2009

D.6 Einfacher Programmaufbau

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Übung 1 - Betriebssysteme I

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Dämon-Prozesse ( deamon )

Beispiel. Problem: mehrteilige Nachnamen (von Goethe, Mac Donald, Di Caprio)

Transkript:

3 Vom C-Programm zum laufenden Prozess 3.1 Übersetzen - Objektmodule 1Übersetzen 3. - Objektmodule (2) Teil III 3Vom C-Programm zum laufenden Prozess 2. Schritt: Compilieren übersetzt C-Code in Assembler Zwischenergebnis kann mit cc -S datei.c als datei.s erzeugt werden 3. Schritt: Assemblieren assembliert Assembler-Code, erzeugt Maschinencode (Objekt-Datei) standardisiertes Objekt-Dateifomat: ELF (Executable and Linking Format) (vereinfachte Darstellung) - in nicht-unix-systemen andere Formate Maschinencode Informationen über Variablen mit Lebensdauer static (ggf. Initialisierungswerte) Symboltabelle: wo stehen welche globale Variablen und Funktionen Relokierungsinformation: wo werden welche "nicht gefundenen" globalen Variablen bzw. Funktionen referenziert Zwischenergebnis kann mit cc -c datei.c als datei.o erzeugt werden Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-3 3 Vom C-Programm zum laufenden Prozess 3.1 Übersetzen - Objektmodule 1Übersetzen 3. - Objektmodule 1. Schritt: Präprozessor entfernt Kommentare, wertet Präprozessoranweisungen aus fügt include-dateien ein expandiert Makros entfernt Makro-abhängige Code-Abschnitte (conditional code) Beispiel: #define DEBUG #ifdef DEBUG printf("zwischenergebnis = %d\n", wert); #endif DEBUG Zwischenergebnis kann mit cc -P datei.c als datei.i erzeugt werden oder mit cc -E datei.c ausgegeben werden 3 Vom C-Programm zum laufenden Prozess 3.2 Binden und Bibliotheken 2Binden 3. und Bibliotheken 4. Schritt: Binden Programm ld : ( linker ), erzeugt ausführbare Datei ( executable file ) ebenfalls ELF-Format (früher a.out-format oder COFF) Objekt-Dateien (.o-dateien) werden zusammengebunden noch nicht abgesättigte Referenzen auf globale Variablen und Funktionen in anderen Objekt-Dateien werden gebunden (Relokation) nach fehlenden Funktionen wird in Bibliotheken gesucht statisch binden alle fehlenden Funktionen werden aus Bibliotheken genommen und in die ausführbare Datei einkopiert ausführbare Datei ggf. sehr groß Funktionen die in vielen Programmen benötigt werden (z. B. printf) werden überall einkopiert Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-2 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-4

3 Vom C-Programm zum laufenden Prozess 3.2 Binden und Bibliotheken 2Binden 3. und Bibliotheken (2) dynamisch binden Funktionen in gemeinsam nutzbare Bibliotheken (shared libraries) werden nicht in die ausführbare Datei einkopiert ausführbare Datei enthält weiterhin nicht-relokierte Referenzen ausführbare Dateien sind kleiner, mehrfach genutzte Funktionen sind nur einmal in der shared library abgelegt Relokation erfolgt beim Laden 1 Speicherorganisation eines Programms definiert durch das ELF-Format wichtigste Elemente (stark vereinfach dargestellt) ELF header ELF header Identifikator und Verwaltungsinformationen (z. B. verschiedene executable Formate möglich) Programmkode initialisierte globale und static Variablen Zuordnung der im Programm verwendeten symbolischen Namen von Funktionen und globalen Variablen zu Adressen (z. B. für Debugger) Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-5 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-7 3Programme 3. und Prozesse Programm: Folge von Anweisungen (hinterlegt beispielsweise als ausführbare Datei auf dem Hintergrundspeicher) Prozess: Programm, das sich in Ausführung befindet, und seine Daten (Beachte: ein Programm kann sich mehrfach in Ausführung befinden) ein Prozess ist damit ein abstraktes Gebilde Prozessinkarnation: eine physische Instanz des abstrakten Gebildes "Prozess" eine konkrete Ausführungsumgebung für ein Programm (Speicher, Rechte, Verwaltungsinformation) 2 Speicherorganisation eines Prozesses Betriebssystemdaten data stack heap bss bss heap stack nicht initialisierte globale und static Variablen (wird vor der Vergabe an den Prozess mit 0 vorbelegt) dynamische Erweiterungen des bss-segments (sbrk(2), malloc(3)) lokale Variablen, Funktionsparameter, Speicherbereiche für Registerinhalte, (wird bei Bedarf dynamisch erweitert) Sprachgebrauch in der Praxis etwas schlampig: mit "Prozess" wird meistens eine Prozessinkarnation gemeint ELF-header Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-6 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-8

3 Vom C-Programm zum laufenden Prozess 3.4 Laden eines Programms 4Laden 3. eines Programms 5Prozesse 3. in eine konkrete Ausführungsumgebung ("Prozessinkarnation") kann ein Programm geladen werden Loader Laden statisch gebundener Programme Segmente der ausführbaren Datei werden in den Speicher geladen abhängig von der jeweiligen Speicherorganisation des Betriebssystems Speicher für nicht-initialisierte globale und static Variablen (bss) wird bereitgestellt Speicher für lokale Variablen (stack) wird bereitgestellt Aufrufparameter werden in Stack- oder Datensegment kopiert, argc und argv-zeiger werden entsprechend initilalisiert main-funktion wird angesprungen 1 Prozesszustände Ein Prozess befindet sich in einem der folgenden Zustände: Erzeugt (New) Prozess wurde erzeugt, besitzt aber noch nicht alle nötigen Betriebsmittel Bereit (Ready) Prozess besitzt alle nötigen Betriebsmittel und ist bereit zum Laufen Laufend (Running) Prozess wird vom realen Prozessor ausgeführt Blockiert (Blocked/Waiting) Prozess wartet auf ein Ereignis (z.b. Fertigstellung einer Ein- oder Ausgabeoperation, Zuteilung eines Betriebsmittels, Empfang einer Nachricht); zum Warten wird er blockiert Beendet (Terminated) Prozess ist beendet; einige Betriebsmittel sind aber noch nicht freigegeben oder Prozess muss aus anderen Gründen im System verbleiben Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-9 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-11 3 Vom C-Programm zum laufenden Prozess 3.4 Laden eines Programms 4Laden 3. eines Programms (2) Laden dynamisch gebundener Programme Spezielles Lade-Programm wird gestartet: ld.so ( dynamic linker/loader ) ld.so erledigt die weiteren Aufgaben Segmente der ausführbaren Datei werden in den Speicher geladen und Speicher für nicht-initialisierte globale und static Variablen (bss) wird angelegt fehlende Funktionen werden aus shared libraries geladen (ggf. rekursiv) noch offene Referenzen werden abgesättigt (Relokation) wenn notwendig werden Initialisierungsfunktionen der shared libraries aufgerufen (z. B. Klasseninitialisierungen bei C++) Parameter für main werden bereigestellt main-funktion wird angesprungen bei Bedarf können auch während der Laufzeit des Programms auf Anforderung desd Programms weitere Funktionen nachgeladen werden (z. B. für plugins) 1 Prozesszustände (2) Zustandsdiagramm erzeugt zugelassen Grund der Blockade ist weggefallen Nach Silberschatz, 1994 bereit Scheduler teilt Prozessor zu Unterbrechung blockiert wartend laufend beendet terminiert impliziter oder expliziter Warteaufruf Scheduler ist der Teil des Betriebssystems, der die Zuteilung des realen Prozessors vornimmt. Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-10 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-12

2 Prozesserzeugung (UNIX) Erzeugen eines neuen UNIX-Prozesses Duplizieren des gerade laufenden Prozesses pid_t fork( void ); Vater else if( p!=(pid_t)-1 ) { 2 Prozesserzeugung (2) Der Kind-Prozess ist eine perfekte Kopie des Vaters Gleiches Programm Gleiche Daten (gleiche Werte in Variablen) Gleicher Programmzähler (nach der Kopie) Gleicher Eigentümer Gleiches aktuelles Verzeichnis Gleiche Dateien geöffnet (selbst Schreib-, Lesezeiger ist gemeinsam) Unterschiede: Verschiedene PIDs fork() liefert verschiedene Werte als Ergebnis für Vater und Kind Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-13 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-15 2 Prozesserzeugung (UNIX) Erzeugen eines neuen UNIX-Prozesses Duplizieren des gerade laufenden Prozesses pid_t fork( void ); Vater else if( p!=(pid_t)-1 ) { Kind else if( p!=(pid_t)-1 ) { 3 Ausführen eines Programms (UNIX) Prozess führt ein neues Programm aus int execve( const char *path, char *const argv[], char *const envp[] ); execve( "someprogram", argv, envp ); Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-14 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-16

3 Ausführen eines Programms (UNIX) Prozess führt ein neues Programm aus int execve( const char *path, char *const argv[], char *const envp[] ); execve( "someprogram", argv, envp ); execve( int main( "someprogram", int argc, char argv, *argv[] envp );) { das vorher ausgeführte Programm ist dadurch endgültig beendet execve kehrt im Erfolgsfall nie zurück Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-17 4 Operationen auf Prozessen (UNIX) Prozess beenden void _exit( int status ); [ void exit( int status ); ] Prozess terminiert - exit kehrt nicht zurück Prozessidentifikator pid_t getpid( void ); /* eigene PID */ pid_t getppid( void ); /* PID des Vaterprozesses */ Warten auf Beendigung eines Kindprozesses pid_t wait( int *statusp ); Prozess wird so lange blockiert bis Kindprozess terminiert über den Parameter werden Informationen über den exit-status des Kindprozesses zurückgeliefert Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 SS 2006 SOS 1 (03-Pro.fm 2006-05-05 16.21) A 3-18