Systemprogrammierung

Ähnliche Dokumente
2Binden 3. und Bibliotheken

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

3. Unix Prozesse. Betriebssysteme Harald Kosch Seite 57

Maschinencode Dateiformat und Stackframes

Übungen zu Systemprogrammierung 1

Übungen zu Systemprogrammierung 1 (SP1)

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

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

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

Linux Prinzipien und Programmierung

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

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Wolfram Burgard

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

Technische Informatik 1

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

Programmierung mit C Zeiger

FACHHOCHSCHULE MANNHEIM

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

Unterlagen. CPP-Uebungen-08/

Teil 3: Konzepte von Betriebssystemen

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

Vorlesung Programmieren

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

8.1 Vom Quellcode zur ausführbaren Programm

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

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

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

Konzepte von Betriebssystemkomponenten

Eine Mini-Shell als Literate Program

C/C++-Programmierung

Betriebssysteme Kapitel E : Prozesse

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

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

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

Was ist ein Prozess?

Dämon-Prozesse ( deamon )

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

Programmiersprachen Einführung in C

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

Threads. Netzwerk - Programmierung. Alexander Sczyrba Jan Krüger

Einführung in die Systemprogrammierung

6 Speicherorganisation

einlesen n > 0? Ausgabe Negative Zahl

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

Implementieren von Klassen

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

F Zeiger, Felder und Strukturen in C

Compiler Präprozessor Header Files

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

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

Der C-Präprozessor. Lukas Stabe

C - PRÄPROZESSOR. Seminar effiziente C Programmierung WS 2012/13. Von Christian Peter

Programmierung in C. Grundlagen. Stefan Kallerhoff

Übersicht zur Programmentwicklung unter UNIX

Objektorientierung: Klassen und Objekte

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Shared-Memory Programmiermodelle

Übung 1 - Betriebssysteme I

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Einführung in die Programmiersprache C

Threads. Foliensatz 8: Threads Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Aufgabenblatt 5 Musterlösung

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

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

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

Assembler - Einleitung

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Dr. Monika Meiler. Inhalt

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

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

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

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

Einführung in die Programmiersprache C

Globale Variablen Diverses. Globale Variablen. Globale Variablen

Dynamische Speicherverwaltung

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

Grundlagen der OO- Programmierung in C#

Hinweise C-Programmierung

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

Praktische Informatik 1

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Programmentwicklung mit C++ (unter Unix/Linux)

Arithmetik in der tcsh

Systempraktikum im Wintersemester 2009/2010 (LMU): Vorlesung vom Foliensatz 2

Dynamische Speicherverwaltung

Algorithmen und Datenstrukturen

Transkript:

Systemprogrammierung 3Vom C-Programm zum laufenden Prozess 6. November 2008 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) 3 Vom C-Programm zum laufenden Prozess 1 Übersetzen - Objektmodule 1Übersetzen - 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 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-2

3 Vom C-Programm zum laufenden Prozess 1 Übersetzen - Objektmodule 1Übersetzen - Objektmodule (2) 2. Schritt: Compilieren übersetzt C-Code in Assembler Zwischenergebnis kann mit cc -S datei.c als datei.s erzeugt werden 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, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-3 3 Vom C-Programm zum laufenden Prozess 2 Binden und Bibliotheken 2Binden 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, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-4

3 Vom C-Programm zum laufenden Prozess 2 Binden und Bibliotheken 2Binden 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 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-5 3 Vom C-Programm zum laufenden Prozess 3 Programme und Prozesse 3Programme 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) Sprachgebrauch in der Praxis etwas schlampig: mit "Prozess" wird meistens eine Prozessinkarnation gemeint Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-6

3 Vom C-Programm zum laufenden Prozess 3 Programme und Prozesse 1 Speicherorganisation eines Programms definiert durch das ELF-Format wichtigste Elemente (stark vereinfach dargestellt) symbol table initialized data text ELF header ELF header text initialized data symbol table 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, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-7 3 Vom C-Programm zum laufenden Prozess 3 Programme und Prozesse 2 Speicherorganisation eines Prozesses Betriebssystemdaten stack heap 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) data bss initialized data text symbol table initialized data text ELF-header Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-8

3 Vom C-Programm zum laufenden Prozess 4 Laden eines Programms 4Laden eines Programms 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 Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-9 3 Vom C-Programm zum laufenden Prozess 4 Laden eines Programms 4Laden 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) Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-10

5Prozesse 3 Vom C-Programm zum laufenden Prozess 5 Prozesse 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, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-11 3 Vom C-Programm zum laufenden Prozess 5 Prozesse 1 Prozesszustände (2) Zustandsdiagramm erzeugt zugelassen bereit Scheduler teilt Prozessor zu laufend beendet terminiert Grund der Blockade ist weggefallen Nach Silberschatz, 1994 Unterbrechung blockiert wartend 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, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-12

3 Vom C-Programm zum laufenden Prozess 5 Prozesse 2 Prozesserzeugung (UNIX) Erzeugen eines neuen UNIX-Prozesses Duplizieren des gerade laufenden Prozesses pid_t fork( void ); pid_t p; Vater p= fork(); if( p == (pid_t)0 ) { /* child */ } else if( p!=(pid_t)-1 ) { /* parent */ } else { /* error */ } Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-13 3 Vom C-Programm zum laufenden Prozess 5 Prozesse 2 Prozesserzeugung (UNIX) Erzeugen eines neuen UNIX-Prozesses Duplizieren des gerade laufenden Prozesses pid_t fork( void ); pid_t p; Vater p= fork(); if( p == (pid_t)0 ) { /* child */ } else if( p!=(pid_t)-1 ) { /* parent */ } else { /* error */ } pid_t p; Kind p= fork(); if( p == (pid_t)0 ) { /* child */ } else if( p!=(pid_t)-1 ) { /* parent */ } else { /* error */ } Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-14

3 Vom C-Programm zum laufenden Prozess 5 Prozesse 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, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-15 3 Vom C-Programm zum laufenden Prozess 5 Prozesse 3 Ausführen eines Programms (UNIX) Prozess führt ein neues Programm aus int execve( const char *path, char *const argv[], char *const envp[] ); Prozess A execve( "someprogram", argv, envp ); Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-16

3 Vom C-Programm zum laufenden Prozess 5 Prozesse 3 Ausführen eines Programms (UNIX) Prozess führt ein neues Programm aus int execve( const char *path, char *const argv[], char *const envp[] ); Prozess A execve( "someprogram", argv, envp ); Prozess A Prozess A 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, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-17 3 Vom C-Programm zum laufenden Prozess 5 Prozesse 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, 2008 SS 2006 SOS 1 (03-Pro.fm 2008-11-06 08.52) A 3-18