1.1.Grundstruktur von Linux Gerätetreiber Systemprogrammierung Kontrollfluss...16

Größe: px
Ab Seite anzeigen:

Download "1.1.Grundstruktur von Linux...3. 1.2.Gerätetreiber...14. 1.3.Systemprogrammierung...16. 1.3.1.Kontrollfluss...16"

Transkript

1 Ein-/Ausgabe Dieser Teil beschreibt die Verwaltung von Ein-/Ausgabegeräten. Wir werden E/A am Beispiel von Linux diskutieren und sehen, wie Gerätetreiber programmiert werden. Inhalt 1.Grundlagen Grundstruktur von Linux Gerätetreiber Systemprogrammierung Kontrollfluss Anwendungsschnittstelle zu Gerätetreibern Programmbeispiele Module Treibergrundlagen Aufbau eines Treibers Zuordnung Applikationsschnittstelle auf Treiber Logische Geräte...43 Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 1/55

2 3.2.2.Major- und Minornumber Treiberfunktionen...48 Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 2/55

3 1.Grundlagen Eine der Hauptaufgaben eines Betriebssystems ist die Überwachung und Steuerung von Ein-/Ausgabegeräten (I/O Devices). Kommandos für die Gerätesteuerung müssen an Geräte gesendet werden können; Unterbrechungen, die von Geräten ausgelöst werden, müssen behandelt werden. Weiterhin sind Fehler, die von einem Gerät verursacht werden, zu verwalten. Ein gutes Betriebssystem stellt dazu eine einfache und leicht zu benutzende Schnittstelle für die Programmierung zur Verfügung. Dadurch können unterschiedliche Geräte auf die selbe Art und Weise angesprochen werden. Im Folgenden wird auf diese Schnittstelle in Linux eingegangen und gezeigt, wie man Gerätetreiber programmiert, um Geräte an ein Linux System anzuschließen. 1.1.Grundstruktur von Linux Die Architektur von Linux ist nachfolgend abgebildet: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 3/55

4 Applications Services Libraries User Systemcall Interface Kernel IO Subsystem Process Management Memory Management Device Driver Layer Hardware Systemcall Interface (Dienstzugangsschnittstelle) Über die Systemcall-Schnittstelle lassen sich aus der Applikation heraus die Dienste des Betriebssystems nutzen. Diese Schnittstelle ist absolut unabhängig von jeglicher Programmiersprache. In den seltensten Fällen greift eine Applikation direkt auf das Systemcall-Interface zu, sondern nutzt zu diesem Zweck Bibliotheksfunktionen. So lautet beispielsweise der Systemcall für die Ausgabe von Daten in eine Datei oder in ein Gerät write. Systemcalls erwarten ihre Argumente entweder in Registern oder auf dem Stack. Ein Systemcall wird dann über den Assemblerbefehl INT bzw. TRAP mit einer Exceptionnummer (bei Linux beispielsweise 0x80) aufgerufen (Softwareinterrupt). Dieser Befehl führt zu einer Exception, wobei die Exceptionnummer innerhalb des Betriebssystems die Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 4/55

5 Dienstaufrufsschnittstelle aktiviert. Hier wird anhand der Registerinhalte (Systemcallcode) in die entsprechenden Funktionen verzweigt. Das folgende Assemblerprogramm verdeutlicht einen Systemcall: $ cat write_hello_world.as.text.globl write_hello_world write_hello_world: movl $4,%eax ; //code fuer write systemcall (4) movl $1,%ebx ; //file descriptor fd (1=stdout) movl $message,%ecx ; //Adresse des Textes (buffer) movl $12,%edx ; //Laenge des auszugebenden Textes int $0x80 ; //SW-Interrupt, Auftrag an das BS ret.data message:.ascii "Hallo World\n" $ Der Code für den Systemcall wird in das Register eax geschrieben. Die Register ebx, ecx und edx werden mit den Parametern des Funktionsaufrufes belegt (in diesem Fall der Dateideskriptor 1 für stdout, die Adresse der auszugebenden Daten "Hello World" und die Länge 12 des auszugebenden Strings). Danach wird der Softwareinterrupt für die Systemcall-Schnittstelle (0x80) aufgerufen. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 5/55

6 Der angegebene Assemblercode realisiert einen Unterprogrammaufruf (ohne Rückgabewert, also vom Typ void), der in einer Objektdatei abgelegt wird (normalerweise wird er in eine Bibliothek geschrieben). $ as write_hello_world.as -o write_hello_world.o $ Dann kann er in einem Anwendungsprogramm (hier C-Programm) verwendet werden: $ cat hello_world.c main( int argc, char **argv ) { write_hello_world(); // rufe Systemcall wie Funktion auf } $ $ cc hello_world.c write_hello_world.o -o hello_world $ hello_world Hallo World $ Process Management C-Compiler verwendet Objektdatei mit Systemcall Objektdatei, die Assembler erzeugt Das Prozess-Management ist für das Scheduling, d.h. für die quasi-parallele Bearbeitung von Rechenprozessen und den Context-Switch zuständig. Das eigentliche Aktivieren des Prozesses durch den Scheduler wird mit Context-Switch bezeichnet. Hierbei werden die bei der letzten Unterbrechung des Rechenprozesses in den Task-Kontroll-Block geretteten Register zurück in die CPU geschrieben und der Program-Counter der CPU mit dem nächsten Befehl des neuen Rechenprozesses geladen. Rechenprozesse bzw. Tasks im System befinden sich immer in einem bestimmten Zuständen. Der Taskzustand als auch diverse andere Informationen (Prozessor-Registerinhal- Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 6/55

7 te, Task-Priorität, bereits verbrauchte Rechnerressourcen) befinden sich im Task-Kontrollblock. Bisher haben wir vier Task-Zustände unterschieden. In der Praxis jedoch werden die Zustände feiner unterteilt, so dass auch durchaus zwischen mehr Zuständen unterschieden wird (z.b. der theoretische Zustand warten kann in einem realen Betriebssystem durch zwei Zustände, nämlich warten_auf_ein_zeitereignis und warten_auf_ein/ausgabe abgebildet sein). Linux kennt insgesamt 6 Taskzustände: 1.TASK_RUNNING Unter Linux werden alle lauffähigen Tasks in einer runqueue genannten Liste eingehängt. Aus dieser Liste wählt der Scheduler den nächsten aktiven Rechenprozess aus (damit entspricht der Zustand TASK_RUNNING dem oben erwähnten Zustand lauffähig). 2.TASK_INTERRUPTIBLE In diesem Wartezustand kann der Task durch Signale oder durch das Ablaufen eines Timers unterbrochen und wieder in den Zustand TASK_RUNNING überführt werden. 3.TASK_UNINTERRUPTIBLE Dies ist ebenfalls ein Wartezustand. Im Unterschied zu TASK_INTERRUPTIBLE kann der Task jedoch nur durch ein wake_up wieder in den Zustand TASK_RUNNING überführt werden. 4.TASK_ZOMBIE Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 7/55

8 Der Task mit diesem Zustand gilt zwar als beendet, aber der zugehörige Elternprozess hat bisher noch nicht den Prozessstatus abgeholt. 5.TASK_STOPPED Der Task wurde angehalten, entweder durch ein entsprechendes Signal oder durch ptrace. Der Systemcall ptrace ermöglicht einem Elternprozess das Debugging des Kindprozesses. 6.SK_EXCLUSIVE Dies ist kein eigener Zustand, vielmehr parametriert er die Wartezustände TASK_INTER- RUPTIBLE und TASK_UNINTERRUPTIBLE. Schlafen mehrere Tasks auf mehrere Waitqueues, wird - falls dieses Flag gesetzt ist - nur dieser eine Task, und nicht alle Tasks geweckt. Unter Linux existiert der Zustand activ nicht explizit. Der Zustand lauffähig ist unter Linux der Zustand RUNNING, der Zustand wartend wird über INTERRUPTIBLE und UNINTERRUP- TIBLE abgebildet. Der Zustand ruhend schließlich ist unter Linux entweder durch ZOMBIE oder STOPPED realisiert. Folgende Prozessübergänge sind möglich: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 8/55

9 fork/clone wait stopped zombie running wakeup wakeup signal interruptible wakeup uninterruptible exit exit current sleep sleep Memory Management Memory-Management umfasst 1.Adressumsetzung 2.Speicherschutz 3.Realisierung virtuellen Speichers. Adressumsetzung ist notwendig, damit Rechenprozesse einen einheitlichen Adressraum haben. Bei der Adressumsetzung wird die logische Adresse, die im Programm verwendet wird, auf eine reale physikalische Adresse umgesetzt. Mittels Speicherschutz wird verhindert, dass Applikationen auf den Speicher anderer Applikationen zugreifen können. Damit kann eine fehlerhafte Applikation den Speicher der anderen Applikationen nicht verändern und den Ablauf nicht stören. Insbesondere ist es auch wichtig, dass Applikationen nicht auf den Speicherbereich zugreifen können, den das Betriebssystem selbst verwendet. Ansonsten könnten diese ja das Betriebssystem zum Absturz bringen. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 9/55

10 Für die Treiberentwicklung ergibt sich das Problem, dass man zwischen dem so genannten User-Space und dem Kernel-Space unterscheiden muss. Ein Treiber hat - als Teil des Betriebssystems - nur direkten Zugriff auf den Kernel-Space. Da der Treiber aber Daten zwischen der Applikation und beispielsweise der Hardware austauschen möchte, muss er auch auf den User-Space zugreifen können. Dies wird durch Funktionen, die vom Betriebssystem zur Verfügung gestellt werden, erreicht (copy_from_user und copy_to_user). Die dritte Aufgabe der Speicherverwaltungseinheit ist es, virtuellen Speicher zur Verfügung zu stellen. Der prinzipiell innerhalb eines Programms adressierbare Adressraum ergibt sich durch die Breite der Adressregister. Hat ein Adressregister beispielsweise eine Breite von 16 Bit, können damit 2 16 =64KByte adressiert werden. Bei 2 32 ergeben sich bereits 4 TByte. Damit lässt sich im Programm mehr Speicher ansprechen, als physikalisch tatsächlich vorhanden ist. Der physikalische Speicher kann dennoch dadurch vergrössert werden, dass man Hintergrundspeicher (Festplattenplatz) mit verwendet. Dabei werden Teile des Hauptspeichers auf die Festplatte ausgelagert, wenn diese nicht benötigt werden. Linux unterstützt virtuellen Speicher. Die Konsequenz für den Treiberprogrammierer: er kann nicht damit rechnen, dass zu jedem Zeitpunkt, an dem möglicherweise eine Treiberfunktion aufgerufen wird, sich auch der zugehörige Userprozess im Speicher befindet. Unter Linux ist dies nur der Fall, wenn die entsprechende Treiberfunktion durch die Applikation getriggert wird (z.b. durch open, close, read oder write). In diesen Fällen läuft der Treiber im so genannten user context. Wird hingegen eine Interrupt-Service-Routine des Treibers aufgerufen, spricht man vom interrupt context, aus dem ein Zugriff auf Userprozess-Ressourcen nicht möglich ist. IO-Subsystem Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 10/55

11 Den einheitlichen Zugriff auf Peripherie (IO) ermöglicht das IO-Subsystem. Dabei hat sich heute im Wesentlichen das Konzept durchgesetzt, Peripherie bzw. Geräte wie Dateien zu betrachten. Nicht die Applikation, aber das Betriebssystem unterscheidet damit mehrere Arten von Dateien: Normale Dateien (ordinary files) Pipes (FIFO-Dateien) Directories und Gerätedateien. Neben dieser Abstraktion bietet das IO-Subsystem auch noch Mechanismen an, um auf Hintergrundspeicher (Festplatte) eine Reihe von Dateien hierarchisch abzulegen. Neben der Schnittstelle zur Applikation für den einheitlichen Hardwarezugriff und dem Filesystem bietet das IO-Subsystem noch die betriebssysteminterne Schnittstelle zur systemkonformen Integration von Hardware an: die so genannte Treiberschnittstelle. Libraries Zum Betriebssystem gehörige Bibliotheken (Libraries) abstrahieren den Zugriff auf die Systemcalls bzw. auf die Dienste. Libraries werden sowohl zu den eigenen Applikationen als auch zu den Dienstprogrammen hinzugebunden. Man unterscheidet statische von dynamischen Bibliotheken. Während statische Libraries zu dem eigentlichen Programm beim Linken hinzugebunden werden, werden dynamische Bibliotheken (auch shared libs genannt) erst dann an das Programm gebunden, wenn dieses ausgeführt werden soll. Das bringt folgende Vorteile mit sich: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 11/55

12 Das eigentliche Programm wird kleiner (der Code für die Libraries muss ja nicht abgelegt werden). Programme können sich eine shared lib teilen, wodurch Hauptspeicherplatz gespart wird. Dass mehrere Programme Code verwenden, der nur einmal im Speicher ist, ist wegen der Trennung von Code- und Datensegment möglich. Nachteilig bei diesem Verfahren ist es, dass zum Ausführen einer Applikation nicht nur selbige, sondern zusätzlich auch alle zugehörigen Bibliotheken in der richtigen Version notwendig sind. Dies führt gerade bei komplexen Applikationen zuweilen zu Problemen. Nicht immer ist die erforderliche Bibliotheksversion auf dem Rechner verfügbar. Linux unterstüzt das Laden dynamischer Libraries unter Programmkontrolle. Dynamisch ladbare Bibliotheken werden im Regelfall vom System zur Applikation dazu gebunden (gelinkt), wenn die Applikation gestartet wird. Daneben gibt es auch die Variante, dass eine Applikation selbst eine Bibliothek lädt. Während früher beim Linken statischer Libraries die komplette Bibliothek hinzugebunden wurde, werden heute aus einer Bibliothek nur die Funktionen extrahiert, die ein Programm auch wirklich einsetzt. Damit wird ebenfalls verhindert, dass der Programmcode auf der einen Seite zu stark anwächst oder auf der anderen Seite Funktionen auf mehrere Libraries verteilt werden. Beispiel: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 12/55

13 $ cat dynamic_load.c #include <stdio.h> #include <dlfcn.h> int main(int argc, char **argv) { void *handle; double (*cosine)(double); // pointer to function with double argument // returning double char *error; handle = dlopen ("libm.so", RTLD_LAZY); if (!handle) { fprintf (stderr, "%s\n", dlerror()); exit(1); } cosine = dlsym(handle, "cos"); // cosine becomes cos-function // out of libm.so if ((error = dlerror())!= NULL) { fprintf (stderr, "%s\n", error); exit(1); } printf ("%f\n", (*cosine)(2.0)); dlclose(handle); return 0; Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 13/55

14 } $ $ gcc dynamic_load.c -ldl -o dynamic_load $ Device Driver Layer In diesem Layer sind Gerätetreiber angesiedelt. Über Gerätetreiber werden die Zugriffe auf die Hardware durchgeführt. 1.2.Gerätetreiber Über Gerätetreiber werden unterschiedlichste Arten von Hardware in ein Betriebssystem, wie z.b. Drucker, Kameras, Tastaturen, Bildschirme, Netzwerkkarten, Scanner integriert. Da diese Geräte über diverse Bussysteme (z.b. PCI, SCSI, USB) angeschlossen werden können, gibt es in Linux unterschiedliche Treiber-Subsysteme. Während traditionell zwischen Character-Devices und Block-Devices unterschieden wird, findet man in Linux die folgenden Subsysteme (unvollständige Liste): Character-Devices Block-Devices Netzwerk SCSI USB Irda Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 14/55

15 Cardbus und PCMCIA Parallelport Für diese Vielfalt ist die Applikationsschnittstelle erweitert worden. Zwischenzeitlich kann man folgende Interfaces differenzieren: Standard API (mit Funktionen wie open, close, read, write und ioctl). Kommunikations-API. Card-Services. Multimedia-Interfaces (z.b. Video4Linux). Durch diese Funktionsaufteilung kommt man zu den so genannten stacked driver, den geschichteten Treibern. Ein low-level Treiber ist für die Ansteuerung der eigentlichen Hardwareschnittstelle, also beispielsweise eines ganz spezifischen USB-Controllers, zuständig. Da die Anzahl bzw. Auswahl der Komponenten für den direkten Hardwarezugriff gering ist, kommt man hier mit einer geringen Anzahl von Treibern aus. Der high-level Treiber dagegen ist für einen Gerätetyp, z.b. eine Webcam zuständig. Zwischen low-level Treiber und high-level Treiber liegt eine Core- Treiber Schicht. Diese erweitert die interne Treiberschnittstelle um gerätetypspezifische Funktionen. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 15/55

16 Applications high level driver core driver low level driver Gerätefunktion Zugriff auf Hardware Hardware SCSI-, PCI- und auch Parallelport-Treiber stellen Untergruppen der Character- und Blockgerätetreiber dar. Irda, USB und Netzwerktreiber bilden eine eigene Gruppe von Treibern. 1.3.Systemprogrammierung Hier wird kurz auf Systemprogrammierung eingegangen aber nur soviel, wie man zum Schreiben von Gerätetreibern braucht Kontrollfluss Für den Zugriff auf ein Gerät gibt es zwei Zugriffsmodi: blocking und non-blocking. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 16/55

17 Diese Zugriffsarten legen fest, wie der Kernel reagieren soll, falls eine Applikation Daten lesen möchte, diese aber zum Zeitpunkt der Anfrage nicht verfügbar sind, bzw. falls eine Applikation Daten schreiben möchte, und diese zum Zeitpunkt der Anfrage nicht schreibbar sind. Die Zugriffsart wird entweder bereits beim Öffnen eines Gerätes spezifiziert oder wird nachträglich mit dem fcntl-aufruf eingestellt. Beim blocking-mode wird die aufrufende Applikation (genauer der aufrufende Thread) blockiert (in den Zustand warten versetzt), solange der Treiber nicht in der Lage ist, angeforderte Daten zu liefern (lesen) oder übergebene Daten zu schreiben. Sobald Daten zum Lesen vorhanden sind bzw. geschrieben werden können, wird der Rechenprozess wieder aufgeweckt. Allerdings kann der Prozess auch dann wieder aufgeweckt werden, falls die Applikation ein Signal geschickt bekommt. Der Systemcall ist damit nicht erfolgreich abgeschlossen und liefert einen entsprechenden Fehlercode zurück. Er muss ein zweites mal gestartet werden. Beispiel für blockierenden Zugriff auf stdin: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 17/55

18 $ cat blocking_access.c #include <stdio.h> int main( int argc, char **argv ) { int fd=0; // stdin, standardmaessig im blocking mode unsigned char buffer[512]; printf("das Programm zeigt den Blocking mode. Es geht erst" "\nweiter, wenn eine Eingabe (mit Return abgeschlossen)" "\neingegeben wird.\n"); printf("warten AUF EINGABE...\n"); read( fd, buffer, sizeof(buffer) ); // read wartet printf("%s\n", buffer); printf("und tschuesss...\n"); } $ Im non-blocking Mode wird der aufrufende Rechenprozess nicht schlafen gelegt, auch wenn keine Daten bereit liegen bzw. geschrieben werden können, sondern der Fehlercode EAGAIN zurückgeliefert. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 18/55

19 $ cat nonblocking_access.c #include <stdio.h> #include <fcntl.h> #include <errno.h> int main( int argc, char **argv ) { int fd=0; // stdin, standardmaessig im blocking mode int retvalue; char buffer[512]; } $ printf("das Programm zeigt den Non-Blocking mode." "\nstdin wird jetzt auf non-blocking umgeschaltet und danach" "\nwird davon gelesen.\n"); printf("warten AUF EINGABE ist hier überflüssig\n"); fcntl( fd, F_SETFL, O_NONBLOCK); // stdin in nonblocking mode setzen retvalue = read( fd, buffer, sizeof(buffer) ); if (retvalue < 0) { // keine Zeichen in Eingabe perror( "nach dem read" ); printf("retvalue (%d) errno=%d\n", retvalue, errno); } else printf("%s\n", buffer ); printf("und tschuesss...\n"); Wie muss das Programm gestertet werden, dass es Daten liest? Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 19/55

20 $ nonblocking_acess < nonblocking_acess.c Das Programm zeigt den Non-Blocking mode. STDIN wird jetzt auf non-blocking umgeschaltet und danach wird davon gelesen. WARTEN AUF EINGABE ist hier überflüssig #include <stdio.h> #include <fcntl.h>... Und tschuesss... $ $ nonblocking_acess Das Programm zeigt den Non-Blocking mode. STDIN wird jetzt auf non-blocking umgeschaltet und danach wird davon gelesen. WARTEN AUF EINGABE ist hier überflüssig nach dem read: Resource temporarily unavailable retvalue (-1) errno=29 Und tschuesss... $ Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 20/55

21 Aufgabe Welche Ausgabe produziert folgender Aufruf des Programms nonblocking_acess. $ echo abc nonblocking_acess??????? $ Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 21/55

22 1.3.2.Anwendungsschnittstelle zu Gerätetreibern Das IO-Subsystem stellt eine einheitliche Schnittstelle für den Zugriff auf Geräte zur Verfügung. Dabei werden Geräte und Dateien aus Sicht der Applikation gleich behandelt. Diese Schnittstelle besteht im Wesentlichen aus den folgenden Funktionen: open close read write ioctl select fcntl lseek Die meisten der o.g. Funktionen haben wir bereits gesehen. open Über diese Funktion meldet sich die Applikation beim Betriebssystem und insbesondere beim Treiber an. Dabei wird über den zu übergebenden symbolischen Namen der zugehörige Treiber ausgewählt. Erst das Betriebssystem, danach der Treiber haben Gelegenheit zu überprüfen, ob die Applikation überhaupt Zugriff auf den Treiber bekommen darf oder nicht. Zugriff wird im Wesentlichen aufgrund zweier Kriterien erteilt beziehungsweise verweigert: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 22/55

23 close read 1.Art des gewünschten Zugriffes: Will die Applikation (nur) lesen und ist dies erlaubt? Will die Applikation (nur) schreiben und ist dies erlaubt? Will die Applikation lesen und schreiben und ist dies erlaubt? 2.Belegung des Treibers durch einen anderen Task. Öffnet die Applikation das Gerät (open), wird überprüft, ob nicht bereits ein anderer Rechenprozess auf das Gerät zugreift. Abhängig vom Treiber bzw. von den Fähigkeiten der angesteuerten Hardware darf z.t. nur ein Rechenprozess zugreifen. Die Zugriffsberechtigungsüberwachung kann auch sehr dediziert erfolgen. Beispielsweise können auf manche Geräte mehrere Tasks lesend zugreifen, aber nur ein Task schreibend. Der open-call liefert bei erfolgreichem Öffnen des Gerätes einen so genannten Filedeskriptor zurück. Dieser Filedeskriptor ist ein Index auf eine im Betriebssystem angelegte Datenstruktur (Speicherbereich), die die für die weiteren (produktiven) Zugriffe notwendige Zuordnung zwischen Rechenprozess und Treiber speichert. Die close Funktion gibt die im Betriebssystem alloziierte Ressource (file-descriptor) wieder frei. Bei Aufruf der Funktion wird auch der Treiber informiert. Dieser kann Aufräumarbeiten durchführen. Er merkt sich, dass das Gerät nicht mehr (durch diesen Rechenprozess) belegt ist und kann auf Treiberebene alloziierte Ressourcen freigeben. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 23/55

24 Über die read Funktion werden Daten zwischen dem Treiber und dem Rechenprozess (Applikation) ausgetauscht. Die Applikation spezifiziert über den Filedeskriptor (erstes Argument) den Treiber, übergibt desweiteren (zweites Argument) eine Speicheradresse, in die die vom Gerät zu lesenden Daten zu schreiben sind und übergibt schließlich als drittes Argument die Anzahl der maximal zu lesenden Bytes. Die Funktion read ist so spezifiziert, dass diese im Default-Zugriffsmode BLOCKING, mindestens 1 Byte zurückgibt oder den entsprechenden Rechenprozess (hier genauer Thread) blockiert (sprich in den Zustand warten versetzt). Oftmals wird fälschlicherweise angenommen, dass die Funktion Daten blockweise übergibt. Das ist aber nicht der Fall. Es ist durchaus legal, dass die Funktion - trotz eines Leseauftrages von 32 Bytes - nur 1 Byte in den Buffer kopiert. Daher muss man ein read grundsätzlich in einer Leseschleife betreiben: for( ByesLeft=BytesToRead, BufPtr=&Buffer; BytesLeft<0; ) { BytesRead=read( fd, BufPtr, BytesLeft ); if( BytesRead 0 ) { // Fehlerbehandlung... } BufPtr+=BytesRead; BytesLeft-=BytesRead; } Die Funktion kann aber auch aufgrund einer Fehlerbedingung abgebrochen werden. Bekommt beispielsweise der aufrufende Rechenprozess ein Signal gesendet, wird der gerade Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 24/55

25 write ioctl aktive Systemcall - und read ist ein Systemcall - abgebrochen und liefert einen entsprechenden Fehlercode. Das Gegenstück zu read ist write. Mittels dieser Funktion schreibt eine Applikation Daten auf ein Gerät. Das Betriebssystem prüft dabei, ob der Rechenprozess überhaupt eine Schreibberechtigung hat. Ist dies der Fall, bekommt der Treiber den Schreibauftrag durchgereicht. Abhängig vom Zugriffsmodus wird der Treiber den Schreibauftrag starten und den zugehörigen Rechenprozess schlafen legen (Blocking-Mode). Ist der Auftrag erledigt, wird der Prozess aufgeweckt und bekommt die Anzahl der geschriebenen Bytes zurückübergeben. Die Applikation stellt die zu schreibenden Daten in einem Buffer zur Verfügung. Der Buffer liegt im Adreßbereich der Applikation und muss daher im Treiber mittels einer Funktion (z.b. copy_from_user) in den Adreßbereich des Kernels (Kernel-Space) kopiert werden. Mittels dieses allgemeinen Systemcalls lassen sich beliebige Funktionalitäten bzw. Daten zwischen Applikation und Treiber austauschen. Ein Gerät kann dabei mehrere IO-Control Kommandos unterstützen, die anhand einer Nummer applikations- und treiberseitig unterschieden werden. So flexibel diese Schnittstelle auch ist, so sehr sollte die Verwendung bzw. Unterstützung im Treiber vermieden werden: IO-Controls stellen letztendlich nicht portierbare Eigenschaften eines Treibers dar. Mittels ioctl lassen sich bei der seriellen Schnittstelle Übertragungsgeschwindigkeit oder auch Parity gerade/ungerade einstellen. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 25/55

26 Die beim ioctl verwendeten Parameter unterscheiden sich bei Windows und Unix. Windows geht neben dem Kommando davon aus, dass zwei Buffer übergeben werden: ein Buffer für Daten an den Treiber und ein Buffer, in den der Treiber Daten für die Applikation ablegen kann. Dieses wird deshalb so gemacht, weil es unter Windows einen so genannten IO-Manager gibt, der für den Austausch von Daten zwischen Kernel- und User-Space zuständig ist. Durch die angegebene Festlegung kann der IO-Manager effizient beim Einsprung in den ioctl die Daten aus dem User-Space in den Kernel-Space kopieren, bzw. beim Aussprung die Daten aus dem Kernel-Space in den User-Space. Unter Linux wird - neben dem ioctl Kommando - nur ein weiteres Datum, im Regelfall ein Zeiger auf eine Datenstruktur, übergeben. Die Datenstruktur selbst wird durch denjenigen, der den Treiber konzipiert, festgelegt. Da vom Treiber aus der Zugriff auf den User-Space problemlos (wenn auch nur über eine Funktion) möglich ist, kann diese Datenstruktur Zeiger enthalten, die in unterschiedliche Speicherbereiche der Applikation zeigen. select/poll Diese Funktionen ermöglichen das Überprüfen, ob ein oder mehrere Geräte Daten zum Lesen bereit haben oder in der Lage sind, Daten zu schreiben. Insbesondere die Fähigkeit, gleich mehrere Geräte oder Dateien gleichzeitig auf diese Eigenschaften hin zu überprüfen, machen die Funktionen zu einer wichtigen Funktionalität komplexerer Applikationen. Da die Funktion select gleichzeitig noch eine Zeitüberwachung ermöglicht, wird die Funktion oft zum Warten auf Ablauf einer Zeitspanne, die unterhalb der mit der Funktion sleep erreichbaren Sekunde liegt, verwendet. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 26/55

27 Beispiel (Test ob innerhalb von 5 Sekunden Daten auf stdin anstehen): $ cat select_stdin.c #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 27/55

28 int main(void){ fd_set rfds; struct timeval tv; int retval; /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds); // remove descriptor from rfds FD_SET(0, &rfds); // add stdin to rfds /* Wait up to five seconds. */ tv.tv_sec = 5; // Micorsec tv.tv_usec = 0; // Nanosec retval = select(1, &rfds, NULL, NULL, &tv); // Don't rely on the //value of tv now! if (retval) printf("data is available now.\n"); /* FD_ISSET(0, &rfds) will be true. */ else printf("no data within five seconds.\n"); } $ exit(0); Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 28/55

29 fcntl lseek Die wichtigsten Zugriffsparameter, wie beispielsweise der Zugriffsmode, werden beim Öffnen eines Gerätes mit angegeben. Einige Parameter, z.b. die Zugriffsart, lassen sich aber mittels fcntl auch nachträglich ändern. Mit dieser Funktion kann in einer Datei (bzw. bei einem Block-Device) gezielt ein bestimmtes Byte gelesen bzw. geschrieben werden. Die mit lseek mögliche Positionierung kann relativ zum Dateianfang, zum Dateiende oder der gerade aktuellen Position erfolgen Programmbeispiele Zwei einfache Beispiel sollen den Zugriff auf Geräte verdeutlichen. Im ersten Beispiel wird auf die Partitionstabelle auf einem PC zugegriffen. Diese befindet sich auf dem ersten Block der jeweiligen Festplatte. Eine Festplatte wird auf das logische Gerät /dev/hda (bzw. /dev/sda bei einer SCSI-Platte) abgebildet. $ cat read_partitionstabelle.c #include <stdio.h> #include <fcntl.h> // für O_RDONLY #define DISKFILE "/dev/hda" // Programm zum Auslesen der Partitionstabelle auf einem PC. // Nur der Superuser darf auf das Device /dev/hda zugreifen. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 29/55

30 main() { int i, j, fd; unsigned char buffer[512]; if( (fd=open(diskfile,o_rdonly))<0 ) { perror( DISKFILE ); exit( -1 ); } // open disk // read first block: partitiontable if( read( fd, buffer, sizeof(buffer) )!=sizeof(buffer) ) { perror( "read" ); exit( -2 ); } } $ // print out partition table for( i=0; i<(sizeof(buffer)/16); i++ ) { for( j=0; j<16; j++ ) { printf("%2.2x ", buffer[i*16+j] ); } printf( "\n"); } close( fd ); Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 30/55

31 Beim zweiten Beispiel werden Daten auf die parallele Schnittstelle ausgegeben. Die erste parallele Schnittstelle heißt /dev/lp0. $ cat write_lp0.c #include <stdio.h> #include <fcntl.h> // für O_RDONLY #define DISKFILE "/dev/lp0" // Programm zur Ausgabe von Zeichen auf die parallele Schnittstelle. main() { int fd; char *ptr="aaaaaa"; } $ if( (fd=open(diskfile,o_wronly))<0 ) { perror( DISKFILE ); exit( -1 ); } if( write( fd,ptr,strlen(ptr))<strlen(ptr) ) { perror( "write" ); } close( fd ); Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 31/55

32 Weitere interessante Themen der Systemprogrammierung unter Linux wären: Prozesse fork Threads Interprozesskommunikation Messages Shared Memory Sockets Signals Semaphore Diese Themen werden in der Wahlpflichtveranstaltung Unix für Entwickler und Systemprogrammierung in Linux oder wenn Zeit ist im Punkt Ausgewählte Themen behandelt. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 32/55

33 2.Module Linux bietet die Möglichkeit, einzelne Funktionalitäten in Form von Modulen auch nach Systemstart nachzuladen bzw. wieder aus dem System zu entfernen. Vorteil: Ressourcen werden nur dann belegt, wenn sie auch tatsächlich benötigt werden. Die Entwicklungszeit wird verkürzt, denn es muss nicht jedes mal ein kompletter Betriebssystemkern hoch- und wieder runter gefahren werden, nur weil sich eine Zeile Code geändert hat. Module stellen also Programmcode dar, welcher ein Stück Funktionalität realisiert, die nicht zu jedem Zeitpunkt benötigt wird. Ein Modul stellt aber nicht zwangsweise eine abgeschlossene Funktionalität dar. Verschiedene Technologien existieren, um eine Aufgabe auf mehrere Module aufzuteilen bzw. Module flexibel mit anderen Modulen interagieren zu lassen. Um Module zu laden, die Liste der geladenen Module anzuzeigen und Module wieder zu entfernen stehen Systemprogramme zur Verfügung: insmod, lsmod und rmmod. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 33/55

34 Außerdem können Module Metainformationen, wie den Author, eine Beschreibung, falls es sich bei einem Modul um einen Treiber handelt die unterstützten Geräte und die Modul-Lizenz enthalten. Unter Linux läßt sich diese Metainformation mit dem Programm modinfo anzeigen. Die Übergabe von (Modul-) Parametern ist beim Laden des Moduls möglich. Da ein Modul kein abgeschlossenes Programm, sondern Teil des Programms Betriebssystemkern ist, gibt es keine main-funktion. Stattdessen ruft der Loader (insmod), sobald sich der Modulcode im Speicher befindet, die Funktion init_module auf, bzw. vor dem Entladen wird die Funtkion cleanup_module aufgerufen. Es reicht aus, diese beiden Funktionen zu codieren, um unter Linux ein Modul erstellt zu haben. Dabei gilt es zu beachten, dass die zu programmierende init_module-funktion den Wert 0 zurück liefert, falls das Laden erfolgreich war. Liefert die Funktion einen anderen Wert zurück, entfernt der Betriebssystemkern den Modulcode wieder aus dem Hauptspeicher unddas Laden war nicht erfolgreich. Das folgende Beispiel zeigt ein einfaches Modul, das in die Logdatei /var/log/messages beim Laden und Entfernen des Moduls einen String schreibt: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 34/55

35 $ #include <linux/fs.h> #include <linux/version.h> #include <linux/module.h> static int init_module(void) { printk("init_module called\n"); return 0; } // write into log message file static void cleanup_module(void) { printk("cleanup_module called\n"); } $ Das Übersetzten eines Moduls erfolgt durch: $ cc -w -O -DMODULE -D KERNEL -I/usr/src/linux-2.4/include -c erstesmodul.c $ Entstanden ist eine Objektdatei: $ ls -l -rw-r--r-- 1 as users Okt 15:43 erstesmodul.c -rw-r--r-- 1 as users Okt 16:06 erstesmodul.o $ Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 35/55

36 Der Superuser darf das Modul laden: # insmod -f erstesmodul.o Warning: kernel-module version mismatch erstesmodul.o was compiled for kernel version while this kernel is version Module erstesmodul loaded, with warnings # Auflisten aller geladenen Module und Check der Logdatei zeigen, dass das Modul geladen wurde und der Code ausgeführt wurde: # lsmod grep erstesmodul erstesmodul (unused) # tail -3 /var/log/messages Oct 1 15:24:36 ibm kernel: PCI: Sharing IRQ 11 with 02:00.0 Okt 1 15:24:42 ibm gdm(pam_unix)[1391]: session opened for user as by (uid=0) Okt 1 16:10:29 ibm su(pam_unix)[3639]: session opened for user root by as(uid=500) Oct 1 16:10:33 ibm kernel: init_module called # Entfernt wird das Modul durch: # rmmod erstesmodul # Soll einem Modul beim Laden ein Parameter mitgegeben werden können, müssen sie in Form von Name-Wert-Paaren angegeben werden: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 36/55

37 # insmod -f modulmitparametern.o ioport=0x3f8 # Im Modul selbst sind die Namen der Name-Wert-Paare als Variablen definiert und über ein Makro (MODULE_PARM) dem System bekanntgegeben. Das Makro MODULE_PARM_DESC dient wiederum zur Ablage von Metainformationen. Dem Makro MODULE_PARM wird als zweiter Parameter der Variablentyp mitgegeben. Neben den Standardvariablen ist auch die Übergabe von Feldern möglich, wobei in diesem Fall die Anzahl der Feldelemente spezifiziert werden muß: [min[-max]]{b,h,i,l,s} Der Parameter min gibt die minimale Anzahl Elemente an, max die maximale. Wird max weggelassen, wird für max der Wert von min angenommen. Folgende Datentypen werden unterstützt: Datentyp Kurzform byte short int long string b h i l s Das folgende Beispiel zeigt, wie ein Modul mit Aufrufparametern zu kodieren ist: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 37/55

38 $ cat modulmitparameter.c #include <linux/fs.h> #include <linux/version.h> #include <linux/module.h> int ioport=0x3e0; MODULE_PARM(ioport,"i"); MODULE_PARM_DESC(ioport, "default is 0x3e0"); static int init_module(void) { printk("init_module called with parameter %d\n, ioport"); return 0; } static void cleanup_module(void) { printk("cleanup_module called\n"); } $ Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 38/55

39 3.Treibergrundlagen Eine Reihe von Eigenschaften macht die Treiberentwicklung unter Linux einfach: Linux-Treiber basieren auf dem bewährten Unix-Konzept zur systemkonformen Einbindung von Geräten in das Betriebssystem. Dank des Modulkonzeptes lassen sich neue Eigenschaften eines Treibers schnell und leicht austesten, ohne dass das Betriebssystem jedes mal neu gebootet werden muss. Zur Erstellung eines Linuxtreibers sind keinerlei zusätzliche Werkzeuge oder Dateien notwendig. Ein Editor, der Compiler und die Headerdateien reichen für die Entwicklung aus. Dank offen gelegtem Quellcode lassen sich auch kompliziertere Probleme schnell lösen. Darüber hinaus gibt es hervorragende Literatur und genügend Hilfestellung über das Internet. 3.1.Aufbau eines Treibers Ein Gerätetreiber ist eine Menge von Funktionen, die vom Treiberprogrammierer zu erstellen sind. Greift eine Applikation über die definierte Applikationsschnittstelle auf den Treiber zu, wird im Treiber eine entsprechende Funktion getriggert. So mündet z.b. der Aufruf von open in der Applikation in einer open-funktion im Treiber. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 39/55

40 Applikationsfunktion triggert Treiberfunktion open() open() User Kernel So wie die Aufrufparameter und die Rückgabewerte der Applikationsaufrufe festgelegt sind, so sind sie auch bei den Treiberfunktionen definiert. Die Rückgabewerte der Treiber-Systemfunktionen (z.b. open, close, read, write) sind identisch mit den Rückgabewerten der entsprechenden Applikationsfunktionen. Das gilt auch für die Fehlercodes, die sich sowohl für die Applikation als auch für die Treiber in der Datei /usr/include/asm/errno.h nachsehen lassen. Die Namen der Funktionen sind im Treiber im Gegensatz zur Applikationsschnittstelle (API) frei wählbar. Damit der Betriebssystemkern weiß, welche Funktionalität eine Funktion realisiert, werden die Adressen der Funktionen vom Treiber in einer Datenstruktur abgelegt (struct file_operations) und bei der Initialisierung dem Kernel übergeben. Die für die Treibererstellung wichtigsten Funktionen sind open, close, read und write. open Diese Funktion wird aufgerufen, sobald eine Applikation ein open auf den Treiber durchführt und der Kernel die Zugriffsberechtigung geprüft hat. Der Treiber überprüft seinerseits even- Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 40/55

41 close tuelle Zugriffskonflikte, alloziiert notwendige Ressourcen und initialisiert die Hardware. Geht alles gut, signalisiert er der Applikation den Erfolg, andernfalls wird der Zugriff auf das Gerät verweigert. Auf einen Treiber kann prinzipiell mehrfach zugegriffen werden. Der zugreifende Prozess wird im Treiber über die Struktur struct file identifiziert. Getriggert durch die close-funktion in der Applikation hat der Treiber die Möglichkeit, für den spezifischen Task alloziierte Ressourcen wieder freizugeben. read und write Im Treiber gibt es jeweils eine Funktion für das Lesen und eine für das Schreiben von Daten. Diese Treiberfunktionen werden ausgeführt, wenn auf den Treiber ein read bzw. write Systemcall ausgeführt wird. Die beim Aufruf an der Applikationsschnittstelle übergebenen Parameter (Adresse und Länge des Buffers) werden direkt an die Treiberfunktionen durchgereicht. Der Treiber muss die Daten in diesen Userbuffer kopieren bzw. von diesem Userbuffer lesen. Für die Verarbeitung der Daten sind möglicherweise Hardwarezugriffe notwendig. Rückgabewert der Funktionen ist die Anzahl der gelesenen bzw. geschriebenen Bytes. Auf welchen Treiber (Treiberauswahl) eine Applikation zugreift, bestimmt sie beim Aufruf der Funktion open anhand des dabei zu übergebenden Dateinamens. Beispiel: lesender und schreibender Zugriff auf ein Diskettenlaufwerk durch: open( ''/dev/floppy'', O_RDWR ); Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 41/55

42 Der Bezug zwischen dem beim Aufruf verwendeten Dateinamen (im Beispiel /dev/floppy) und dem Treiber geschieht über eine systemweit eindeutige Nummer, der so genannten Majornumber. Wird eine Gerätedatei im Filesystem angelegt, muß die zugehörige Majornummer mit angegeben werden. Die Majornumber wird entweder im Treiber festgelegt oder vom Kernel vergeben. Der Treiber selbst meldet sich ebenfalls unter dieser Nummer bei seiner Initialisierung beim Betriebssystem an (beispielsweise mit Hilfe der Funktion register_chrdev). Bei dieser Anmeldung wird auch die Liste der Funktionsadressen (struct file_operations) mit übergeben. struct file_operations ist ein Array von Zeigern auf die Treiberfunktionen. struct file_operations open() close read() Neben den Treiberfunktionen, die durch die Applikation selbst getriggert werden, kann ein Treiber weitere Funktionen enthalten, die entweder durch die Hardware oder durch das Betriebssys- Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 42/55

43 tem aufgerufen werden. Im ersten Fall handelt es sich um Interrupt-Service-Routinen, im zweiten Fall können das beispielsweise zeitgesteuerte Funktionen sein. Zur systemkonformen Einbindung des Treibers in das Betriebssystem stehen eine Reihe von Funktionen zur Verfügung. Mit Hilfe dieser Funktionen lassen sich Ressourcen allokieren, OS- interne Dienste nutzen oder auch nur Taskzustände verändern (z.b. Schlafen legen der Task). 3.2.Zuordnung Applikationsschnittstelle auf Treiber Logische Geräte Ein Gerätetreiber steuert eine bestimmte Art von Geräten an. So ist beispielsweise für die seriellen Schnittstellen ein Treiber - und nicht für jede einzelne serielle Schnittstelle ein eigener - zuständig. Der Gerätetreiber schafft eine Sicht des physikalischen Gerätes für die Applikation. Man spricht hier von logischen Geräten, weil diese Sicht nicht viel mit der physikalischen Ausprägung (Hardwareschnittstelle) zu tun haben muss. Das physikalische Gerät wird auf eine oder mehrere so genannte (logische) Gerätedateien abgebildet. Werden zur Abbildung mehrere logische Gerätedateien verwendet, verbirgt sich im Regelfall hinter jeder Gerätedatei eine bestimmte Funktionalität. So wird beispielsweise im PC unter Linux die erste SCSI-Festplatte als /dev/sda abgebildet. Über diese Datei kann eine entsprechend berechtigte Applikation jeden einzelnen Block der Platte lesen. Daneben werden aber auch noch die Dateien /dev/sda1 bis /dev/sda4 (und noch mehr) zur Verfügung gestellt. Diese repräsentieren jeweils eine Partition auf der Festplatte. Greift eine Applikation auf /dev/sda2 zu, hat sie Zugriff auf die zweite Partition. Die Daten der 1. oder 3. Partition sind damit aber nicht zu lesen. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 43/55

44 Für die serielle Schnittstelle gilt ähnliches. Je nachdem, welches logische Gerät angesprochen wird (z.b. /dev/ttys0 oder /dev/cua0), werden beim nachfolgenden Zugriff auf die Schnittstelle unterschiedliche Handshake-Signale verwendet Major- und Minornumber Treiber werden über den Mechanismus der ladbaren Module Teil des Betriebssystems. Werden sie durch das Laden aktiviert, reservieren sie die für die Ansteuerung der Hardware notwendigen Ressourcen. Danach melden sie sich als Treiber beim System an. Damit eine Applikation einen Treiber identifizieren kann, ist dem symbolischen Geräte-namen (Treibernamen) eine so genannte Majornumber zugeordnet. Da der Treiber bei der Initialisierung (in der Funktion init_module beim Aufruf der Funktion register_chardev) sich beim Betriebssystem ebenfalls unter einer Majornumber anmeldet, kann das Betriebssystem die Zuordnung zum Treiber durchführen. Treiber Code: register_chardev(majorno, Mini-Driver,...) BS: $ mknode NameLogGeraet MajorNo Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 44/55

45 Das beschriebene Verfahren hat das Problem, dass die Majornumber eine Zahl im Bereich zwischen 0 und 255 ist. Es ist leicht vorstellbar, dass in der Praxis jedoch mehr als 255 Treiber existieren. Dieses Problem wird durch eine dynamische Zuteilung der Majornumber gelöst. Die Applikation interessiert sich nicht für die Majornumber, sondern greift über den symbolischen Namen zu. Der Treiber selbst meldet sich beim System zudem nicht nur mit einer Majornumber, sondern ausserdem mit einem symbolischen Namen (der jedoch nicht identisch sein muß mit dem symbolischen Namen, den die Applikation später verwendet) an. Unter Linux ist daher festgelegt worden, dass das Betriebssystem die nächste freie Majornumber vergibt, wenn ein Treiber beim Anmelden (Registrieren) die Majornumber 0 angibt. Auf der User-Ebene wird nach dem Laden des Treibers ein Programm (Skript) gestartet, welches über den dem Skript bekannten Treibernamen aus /proc/devices die vom System vergebene Majornumber ausliest und ein Gerätefile mit dieser Majornumber anlegt. Ein solches Skript könnte folgendermassen aussehen: Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 45/55

46 $ cat createdevice.ksh #!/bin/sh Module="access" ModuleName="BufDevice-Driver" DeviceName="Driver" MinorNumber=0 # Insert Module /sbin/rmmod $Module /sbin/insmod -f $Module.o exit 1 # Identify allocated major number MajorNumber=`cat /proc/devices grep $ModuleName cut -c1-3` if [ "${MajorNumber}y" == "y" ] then echo "Module with name \"$ModuleName\" does not exist." exit 1 fi # create device rm -f $DeviceName mknod $DeviceName c $MajorNumber $MinorNumber $ Neben der Majornumber gibt es auch noch eine Minornumber. Diese ist genauso wie die Majornumber mit dem symbolischen Geräteeintrag im Filesystem (Gerätenamen) verbunden. Dadurch lassen sich mehrere Gerätenamen (also die logischen Geräte), die mit einem Treiber Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 46/55

47 assoziiert sind, anlegen und im Treiber unterscheiden. Somit stellen die Minor-Nummern einen Parameter dar, der dem Treiber bei den Aufrufen mit übergeben wird. Über die Minornumber können mehrere Informationen codiert werden: Funktionalitäten (z.b. die Art des Handshaking bei der seriellen Schnittstelle) Zugriffsbereiche (z.b. die einzelnen Partitionen einer Festplatte) eine spezifische Hardware, z.b. ob die 1. oder die 2. serielle Schnittstelle verwendet werden soll. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 47/55

48 3.3.Treiberfunktionen Über die Majornumber wird die Beziehung zwischen einem Open-Call auf der Applikationsseite und dem eigentlichen Gerätetreiber hergestellt. Prinzipiell existiert für jeden der erwähnten Systemcalls eine korrespondierende Funktion im Treiber. Damit muss der Treiberprogrammierer diesen Satz von Funktionen erstellen, um einen Treiber geschrieben zu haben. Ein Treiber besteht damit aus den folgenden Funktionen: init_module cleanup_module driver_open driver_close driver_read driver_write driver_select driver_poll driver_ioctl Hinzu kommen noch Treiber-interne Funktionen, beispielsweise Interrupt-Service-Routinen. Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 48/55

49 Ruft die Applikation also ein open auf, reicht das Betriebssystem genau diesen Aufruf an die open Funktion des ausgewählten Treibers weiter. Ruft die Applikation ein read auf, um vom Gerät Daten zu lesen, wird dieser Aufruf durch das Betriebssystem an das driver-read weitergeleitet. Nicht jeder Treiber implementiert alle aufgeführten Funktionen. Darüber hinaus existieren noch weitere Funktionen, die bisher nicht erwähnt wurden, insbesondere für die Ankopplung von Block-Devices an ein Filesystem. Die Namen der Funktionen init_module und cleanup_module sind fix und können nicht geändert werden. Demgegenüber sind die Namen der übrigen Funktionen frei wählbar. Damit kann im Treiber die Funktion driver_open problemlos oeffne_geraet genannt werden. Das Betriebssystem bekommt bei der Initialisierung (Registrierung des Treibers) eine Liste der Funktionsnamen mitgeteilt, wobei die Position auf dieser Liste über die Bedeutung einer Funktion entscheidet. Führt die Applikation beispielsweise einen read Aufruf durch, wird die Funktion aufgerufen, die auf dieser Liste an dritter Stelle steht. Die Liste ist unter Linux folgendermaßen strukturiert: struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 49/55

50 }; int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); static struct file_operations DriverFops = { THIS_MODULE, /* ab Kernel 2.4, define in module.h */ NULL, /* llseek */ DriverRead, /* read */ DriverWrite, /* write */ NULL, /* readdir */ NULL, /* poll */ DriverIoctl, /* ioctl */ NULL, /* mmap */ DriverOpen, /* open */ NULL, /* flush */ DriverClose, /* release */ NULL, /* fsync */ NULL, /* fasync */ NULL, /* check_media_change */ NULL, /* revalidate */ NULL, /* lock */ NULL, /* readv */ NULL, /* writev */ }; Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 50/55

51 Wird der Treiber geladen, wird zunächst die Treiber-Funktion init_module aufgerufen. Diese Funktion hat die Aufgabe, das zugehörige Gerät zu finden und schließlich den Treiber beim System anzumelden (register_chardev). Anhand des Parameters beim open-call erkennt das Betriebssystem den von der Applikation gewünschten Treiber, da im Filesystem ja die Zuordnung zwischen dem symbolischen Geräte-namen und der zugehörigen Majornumber stattfindet. Die Treiber-Funktion open wird durch das System angestoßen und überprüft, ob die Applikation auf das Gerät zugreifen darf oder nicht. Ist das der Fall, gibt die Treiberfunktion 0 zurück, ansonsten einen sinnvollen Fehlercode. Konnte das Gerät ``geöffnet'' werden, greift die Applikation über den beim Öffnen zurückgegebenen Filedeskriptor zu. Die an der Applikation übergebenen Argumente werden der zugehörigen Treiberfunktion übermittelt. Der Treiber muss darauf achten, dass von der Applikation übergebene Zeiger (z.b. der Buffer) nicht direkt verwendet werden dürfen! Im Betriebssystemkern, also damit auch im Treiber (als Teil des Betriebssystemkerns), kann nicht direkt auf den Speicher zugegriffen werden, da das Memory-Management die Speicherbereiche der Applikationen und des Kernels voreinander schützt. Schließt die Applikation das Gerät wieder, wird wiederum eine korrespondierende Funktion im Treiber aufgerufen: release. Der folgende Programmcode zeigt einen einfachen Linux-Treiber (nur die open-funktion ist realisiert): Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 51/55

52 $ cat FirstOpen.c /* Open Aufruf */ #include <linux/module.h> #include <linux/init.h> #include <asm/io.h> MODULE_LICENSE("GPL"); #define MINI_MAJOR 240 static int DriverOpen( struct inode *inode, struct file *file ){ printk("driveropen called\n"); return( 0 ); } static struct file_operations MiniFops = { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) THIS_MODULE, #endif NULL, /* llseek */ NULL, /* read */ NULL, /* write */ NULL, /* readdir */ NULL, /* poll */ NULL, /* ioctl */ NULL, /* mmap */ DriverOpen, /* open */ Betriebssysteme: EingabeAusgabe.sxw Prof. Dr. Alois Schütte 52/55

Architektur Verteilter Systeme Teil 2: Prozesse und Threads

Architektur Verteilter Systeme Teil 2: Prozesse und Threads Architektur Verteilter Systeme Teil 2: Prozesse und Threads 21.10.15 1 Übersicht Prozess Thread Scheduler Time Sharing 2 Begriff Prozess und Thread I Prozess = Sequentiell ablaufendes Programm Thread =

Mehr

Datensicherung. Beschreibung der Datensicherung

Datensicherung. Beschreibung der Datensicherung Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten

Mehr

Tapps mit XP-Mode unter Windows 7 64 bit (V2.0)

Tapps mit XP-Mode unter Windows 7 64 bit (V2.0) Tapps mit XP-Mode unter Windows 7 64 bit (V2.0) 1 Einleitung... 2 2 Download und Installation... 3 2.1 Installation von WindowsXPMode_de-de.exe... 4 2.2 Installation von Windows6.1-KB958559-x64.msu...

Mehr

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige

Mehr

4D Server v12 64-bit Version BETA VERSION

4D Server v12 64-bit Version BETA VERSION 4D Server v12 64-bit Version BETA VERSION 4D Server v12 unterstützt jetzt das Windows 64-bit Betriebssystem. Hauptvorteil der 64-bit Technologie ist die rundum verbesserte Performance der Anwendungen und

Mehr

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt Inhaltsverzeichnis Aufgabe... 1 Allgemein... 1 Active Directory... 1 Konfiguration... 2 Benutzer erstellen... 3 Eigenes Verzeichnis erstellen... 3 Benutzerkonto erstellen... 3 Profil einrichten... 5 Berechtigungen

Mehr

Übung: Verwendung von Java-Threads

Übung: Verwendung von Java-Threads Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Handbuch USB Treiber-Installation

Handbuch USB Treiber-Installation Handbuch USB Treiber-Installation W&T Release 1.0 02/2003 by Wiesemann & Theis GmbH Microsoft und Windows sind eingetragene Warenzeichen der Microsoft Corporation Irrtum und Änderung vorbehalten: Da wir

Mehr

Dämon-Prozesse ( deamon )

Dämon-Prozesse ( deamon ) Prozesse unter UNIX - Prozessarten Interaktive Prozesse Shell-Prozesse arbeiten mit stdin ( Tastatur ) und stdout ( Bildschirm ) Dämon-Prozesse ( deamon ) arbeiten im Hintergrund ohne stdin und stdout

Mehr

Tutorial - www.root13.de

Tutorial - www.root13.de Tutorial - www.root13.de Netzwerk unter Linux einrichten (SuSE 7.0 oder höher) Inhaltsverzeichnis: - Netzwerk einrichten - Apache einrichten - einfaches FTP einrichten - GRUB einrichten Seite 1 Netzwerk

Mehr

Anleitung zur Erstellung einer Batchdatei. - für das automatisierte Verbinden mit Netzlaufwerken beim Systemstart -

Anleitung zur Erstellung einer Batchdatei. - für das automatisierte Verbinden mit Netzlaufwerken beim Systemstart - Anleitung zur Erstellung einer Batchdatei - für das automatisierte Verbinden mit Netzlaufwerken beim Systemstart - Mögliche Anwendungen für Batchdateien: - Mit jedem Systemstart vordefinierte Netzlaufwerke

Mehr

Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012

Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012 WS 2011/2012 Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012 Prof. Dr. Robert Lorenz Musterlösung zur Vorlesung Informatik I, Extrablatt zu komplexen Datenstrukturen Aufgabe 45 **

Mehr

Kernel Programmierung unter Linux. Programmierung von Kernelmodulen. Referent Klaus Ruhwinkel

Kernel Programmierung unter Linux. Programmierung von Kernelmodulen. Referent Klaus Ruhwinkel Kernel Programmierung unter Linux Programmierung von Kernelmodulen Referent Klaus Ruhwinkel Das Betriebssystem Aufbau des Betriebssystem: Es besteht aus den Betriebssystemkern und den sonstigen Betriebssystemkomponenten

Mehr

Stepperfocuser 2.0 mit Bootloader

Stepperfocuser 2.0 mit Bootloader Stepperfocuser 2.0 mit Bootloader Info Für den Stepperfocuser 2.0 gibt es einen Bootloader. Dieser ermöglicht es, die Firmware zu aktualisieren ohne dass man ein spezielles Programmiergerät benötigt. Die

Mehr

2. Word-Dokumente verwalten

2. Word-Dokumente verwalten 2. Word-Dokumente verwalten In dieser Lektion lernen Sie... Word-Dokumente speichern und öffnen Neue Dokumente erstellen Dateiformate Was Sie für diese Lektion wissen sollten: Die Arbeitsumgebung von Word

Mehr

FILE *fp; char fname[100];... fp = fopen (fname, rb ); if( fp == NULL ) { perror( fopen );... } // Fehlernachricht auf letzten Fehler, der aufkam

FILE *fp; char fname[100];... fp = fopen (fname, rb ); if( fp == NULL ) { perror( fopen );... } // Fehlernachricht auf letzten Fehler, der aufkam Aktuelle Fileposition ermitteln long pos; pos=ftell(fp); //aktuelle Bytenummer Filelaenge in Bytes fseek(fp,0,seek_end); pos=ftell(fp); Fileendeerkennung int rc; rc = feof (fp) //!= 0 bei Fileende // ==

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

HTBVIEWER INBETRIEBNAHME

HTBVIEWER INBETRIEBNAHME HTBVIEWER INBETRIEBNAHME Vorbereitungen und Systemvoraussetzungen... 1 Systemvoraussetzungen... 1 Betriebssystem... 1 Vorbereitungen... 1 Installation und Inbetriebnahme... 1 Installation... 1 Assistenten

Mehr

Qt-Projekte mit Visual Studio 2005

Qt-Projekte mit Visual Studio 2005 Qt-Projekte mit Visual Studio 2005 Benötigte Programme: Visual Studio 2005 Vollversion, Microsoft Qt 4 Open Source s. Qt 4-Installationsanleitung Tabelle 1: Benötigte Programme für die Qt-Programmierung

Mehr

Objektbasierte Entwicklung

Objektbasierte Entwicklung Embedded Software Objektbasierte Entwicklung Objektorientierung in C? Prof. Dr. Nikolaus Wulff Objektbasiert entwickeln Ohne C++ wird meist C im alten Stil programmiert. => Ein endlose while-schleife mit

Mehr

Step by Step Webserver unter Windows Server 2003. von Christian Bartl

Step by Step Webserver unter Windows Server 2003. von Christian Bartl Step by Step Webserver unter Windows Server 2003 von Webserver unter Windows Server 2003 Um den WWW-Server-Dienst IIS (Internet Information Service) zu nutzen muss dieser zunächst installiert werden (wird

Mehr

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten In dem Virtuellen Seminarordner werden für die Teilnehmerinnen und Teilnehmer des Seminars alle für das Seminar wichtigen Informationen,

Mehr

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu) HMExcel Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu) Inhalt 1. Einleitung...1 2. Beispiele...2 2.1. Daten in ein Tabellenblatt schreiben...2

Mehr

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung Anleitung zur Daten zur Datensicherung und Datenrücksicherung Datensicherung Es gibt drei Möglichkeiten der Datensicherung. Zwei davon sind in Ges eingebaut, die dritte ist eine manuelle Möglichkeit. In

Mehr

Computeria Solothurn

Computeria Solothurn Computeria Solothurn Seniorinnen und Senioren entdecken den Computer und das Internet Sich mit «TeamViewer» von einem Supporter helfen lassen Diese Anleitung und die Illustrationen wurden unter Mac OS

Mehr

Task: Nmap Skripte ausführen

Task: Nmap Skripte ausführen Task: Nmap Skripte ausführen Inhalt Einfache Netzwerkscans mit NSE Ausführen des Scans Anpassung der Parameter Einleitung Copyright 2009-2015 Greenbone Networks GmbH Herkunft und aktuellste Version dieses

Mehr

Einführung in die C-Programmierung

Einführung in die C-Programmierung Einführung in die C-Programmierung Warum C? Sehr stark verbreitet (Praxisnähe) Höhere Programmiersprache Objektorientierte Erweiterung: C++ Aber auch hardwarenahe Programmierung möglich (z.b. Mikrokontroller).

Mehr

CMS.R. Bedienungsanleitung. Modul Cron. Copyright 10.09.2009. www.sruttloff.de CMS.R. - 1 - Revision 1

CMS.R. Bedienungsanleitung. Modul Cron. Copyright 10.09.2009. www.sruttloff.de CMS.R. - 1 - Revision 1 CMS.R. Bedienungsanleitung Modul Cron Revision 1 Copyright 10.09.2009 www.sruttloff.de CMS.R. - 1 - WOZU CRON...3 VERWENDUNG...3 EINSTELLUNGEN...5 TASK ERSTELLEN / BEARBEITEN...6 RECHTE...7 EREIGNISSE...7

Mehr

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Peter Koos 03. Dezember 2015 0 Inhaltsverzeichnis 1 Voraussetzung... 3 2 Hintergrundinformationen... 3 2.1 Installationsarten...

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales

Mehr

Zugriff auf Daten der Wago 750-841 über eine Webseite

Zugriff auf Daten der Wago 750-841 über eine Webseite Zugriff auf Daten der Wago 750-841 über eine Webseite Inhaltsverzeichnis Einleitung... 3 Auslesen von Variablen... 4 Programm auf der SPS... 4 XML-Datei auf der SPS... 4 PHP-Script zum Auslesen der XML-Datei...

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Dateiname: ecdl5_01_00_documentation_standard.doc Speicherdatum: 14.02.2005 ECDL 2003 Basic Modul 5 Datenbank - Grundlagen

Mehr

Kostenstellen verwalten. Tipps & Tricks

Kostenstellen verwalten. Tipps & Tricks Tipps & Tricks INHALT SEITE 1.1 Kostenstellen erstellen 3 13 1.3 Zugriffsberechtigungen überprüfen 30 2 1.1 Kostenstellen erstellen Mein Profil 3 1.1 Kostenstellen erstellen Kostenstelle(n) verwalten 4

Mehr

Windows 7 Winbuilder USB Stick

Windows 7 Winbuilder USB Stick Windows 7 Winbuilder USB Stick Benötigt wird das Programm: Winbuilder: http://www.mediafire.com/?qqch6hrqpbem8ha Windows 7 DVD Der Download wird in Form einer gepackten Datei (7z) angeboten. Extrahieren

Mehr

Prozesse und Logs Linux-Kurs der Unix-AG

Prozesse und Logs Linux-Kurs der Unix-AG Prozesse und Logs Linux-Kurs der Unix-AG Benjamin Eberle 22. Januar 2015 Prozesse unter Linux gestartete Programme laufen unter Linux als Prozesse jeder Prozess hat eine eindeutige Prozess-ID (PID) jeder

Mehr

Aufbau eines Kernelmoduls

Aufbau eines Kernelmoduls Kernel Module Kernelmodul = ladbare/entfernbare Objektdatei (Dateisystem, Gerätetreiber, Systemeingriffe) Vorteile: Ressourcenverbrauch abhängig vom aktuellen Anforderungen Erweiterung der Kernelfunktionalität

Mehr

! " # $ " % & Nicki Wruck worldwidewruck 08.02.2006

!  # $  % & Nicki Wruck worldwidewruck 08.02.2006 !"# $ " %& Nicki Wruck worldwidewruck 08.02.2006 Wer kennt die Problematik nicht? Die.pst Datei von Outlook wird unübersichtlich groß, das Starten und Beenden dauert immer länger. Hat man dann noch die.pst

Mehr

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Diese Verbindung muss einmalig eingerichtet werden und wird benötigt, um den Zugriff vom privaten Rechner oder der Workstation im Home Office über

Mehr

Beispiel Shop-Eintrag Ladenlokal & Online-Shop im Verzeichnis www.wir-lieben-shops.de 1

Beispiel Shop-Eintrag Ladenlokal & Online-Shop im Verzeichnis www.wir-lieben-shops.de 1 Beispiel Shop-Eintrag Ladenlokal & Online-Shop. Als Händler haben Sie beim Shop-Verzeichnis wir-lieben-shops.de die Möglichkeit einen oder mehrere Shop- Einträge zu erstellen. Es gibt 3 verschiedene Typen

Mehr

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG it4sport GmbH HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG Stand 10.07.2014 Version 2.0 1. INHALTSVERZEICHNIS 2. Abbildungsverzeichnis... 3 3. Dokumentenumfang... 4 4. Dokumente anzeigen... 5 4.1 Dokumente

Mehr

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld "Sharing". Auf dem Bildschirm sollte folgendes Fenster erscheinen:

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld Sharing. Auf dem Bildschirm sollte folgendes Fenster erscheinen: Einleitung Unter MacOS X hat Apple die Freigabe standardmäßig auf den "Public" Ordner eines Benutzers beschränkt. Mit SharePoints wird diese Beschränkung beseitigt. SharePoints erlaubt auch die Kontrolle

Mehr

5 Speicherverwaltung. bs-5.1 1

5 Speicherverwaltung. bs-5.1 1 5 Speicherverwaltung bs-5.1 1 Pufferspeicher (cache) realer Speicher Primärspeicher/Arbeitsspeicher (memory) Sekundärspeicher/Hintergrundspeicher (backing store) (Tertiärspeicher/Archivspeicher) versus

Mehr

Virtuelle COM-Schnittstelle umbenennen

Virtuelle COM-Schnittstelle umbenennen Virtuelle COM-Schnittstelle umbenennen COM-Nummer eines USB/Seriell-Wandlers verändern Wenn man ein Gerät mit einem USB/Seriell-Wandler neu anschließt, wird meist eine neue virtuelle COM- Schnittstelle

Mehr

OP-LOG www.op-log.de

OP-LOG www.op-log.de Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server

Mehr

Installation SQL- Server 2012 Single Node

Installation SQL- Server 2012 Single Node Installation SQL- Server 2012 Single Node Dies ist eine Installationsanleitung für den neuen SQL Server 2012. Es beschreibt eine Single Node Installation auf einem virtuellen Windows Server 2008 R2 mit

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Artikel Schnittstelle über CSV

Artikel Schnittstelle über CSV Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte

Mehr

Anleitung zur Nutzung des SharePort Utility

Anleitung zur Nutzung des SharePort Utility Anleitung zur Nutzung des SharePort Utility Um die am USB Port des Routers angeschlossenen Geräte wie Drucker, Speicherstick oder Festplatte am Rechner zu nutzen, muss das SharePort Utility auf jedem Rechner

Mehr

LPT1 Anschluss mit PCMCIA Karte

LPT1 Anschluss mit PCMCIA Karte 1. Allgemeines LPT1 Anschluss mit PCMCIA Karte verwendete Hardware: Lenze PC Systembusadapter EMF 2173-V003 PCMCIA Karte Firma QUATECH Typ SPP-100 Auf die Installation der PCMCIA Karte wird hier nicht

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion

Mehr

ÖKB Steiermark Schulungsunterlagen

ÖKB Steiermark Schulungsunterlagen ÖKB Steiermark Schulungsunterlagen Fotos von Online-Speicher bereitstellen Da das hinzufügen von Fotos auf unsere Homepage recht umständlich und auf 80 Fotos begrenzt ist, ist es erforderlich die Dienste

Mehr

Zugriff auf die Modul-EEPROMs

Zugriff auf die Modul-EEPROMs MAX-P- und P-Bibliotheken EEPROM-Zugriff 1 Zugriff auf die Modul-EEPROMs Jedes X-Bus-Modul verfügt über ein EEPROM, in dem modulspezifische Daten gespeichert werden. Neben einigen Bereichen, die vom Betriebssystem

Mehr

Grundlagen verteilter Systeme

Grundlagen verteilter Systeme Universität Augsburg Insitut für Informatik Prof. Dr. Bernhard Bauer Wolf Fischer Christian Saad Wintersemester 08/09 Übungsblatt 3 12.11.08 Grundlagen verteilter Systeme Lösungsvorschlag Aufgabe 1: a)

Mehr

icloud nicht neu, aber doch irgendwie anders

icloud nicht neu, aber doch irgendwie anders Kapitel 6 In diesem Kapitel zeigen wir Ihnen, welche Dienste die icloud beim Abgleich von Dateien und Informationen anbietet. Sie lernen icloud Drive kennen, den Fotostream, den icloud-schlüsselbund und

Mehr

Aufruf der Weboberflache des HPM- Warmepumpenmanagers aus dem Internet TIPPS

Aufruf der Weboberflache des HPM- Warmepumpenmanagers aus dem Internet TIPPS Aufruf der Weboberflache des HPM- Warmepumpenmanagers aus dem Internet TIPPS Oktober 2015 Tipp der Woche vom 28. Oktober 2015 Aufruf der Weboberfläche des HPM-Wärmepumpenmanagers aus dem Internet Der Panasonic

Mehr

Speichern. Speichern unter

Speichern. Speichern unter Speichern Speichern unter Speichern Auf einem PC wird ständig gespeichert. Von der Festplatte in den Arbeitspeicher und zurück Beim Download Beim Kopieren Beim Aufruf eines Programms Beim Löschen Beim

Mehr

Installation eines BM-33k6/ISDN pro USB an einem Windows XP-Rechner

Installation eines BM-33k6/ISDN pro USB an einem Windows XP-Rechner Installation eines BM-33k6/ISDN pro USB an einem Windows XP-Rechner Falls Sie den Treiber für das Modem BM-33k6/ISDN pro USB updaten wollen, sollten Sie zunächst den alten Treiber entfernen. Danach können

Mehr

Der große VideoClip- Wettbewerb von Media Markt.

Der große VideoClip- Wettbewerb von Media Markt. Der große VideoClip- Wettbewerb von Media Markt. Zeig was du drauf hast! Am 1. Juli startet eine Aktion, wie sie die Schweiz noch nicht gesehen hat. Unter dem Motto Zeig was Du drauf hast! suchen wir den

Mehr

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER Inhalt 1 Einleitung... 1 2 Einrichtung der Aufgabe für die automatische Sicherung... 2 2.1 Die Aufgabenplanung... 2 2.2 Der erste Testlauf... 9 3 Problembehebung...

Mehr

Visual Basic Express Debugging

Visual Basic Express Debugging Inhalt Dokument Beschreibung... 1 Projekt vorbereiten... 1 Verknüpfung zu Autocad/ProStructures einstellen... 2 Debugging... 4 Autocad/ProSteel Beispiel... 5 Dokument Beschreibung Debuggen nennt man das

Mehr

Konfiguration VLAN's. Konfiguration VLAN's IACBOX.COM. Version 2.0.1 Deutsch 01.07.2014

Konfiguration VLAN's. Konfiguration VLAN's IACBOX.COM. Version 2.0.1 Deutsch 01.07.2014 Konfiguration VLAN's Version 2.0.1 Deutsch 01.07.2014 In diesem HOWTO wird die Konfiguration der VLAN's für das Surf-LAN der IAC-BOX beschrieben. Konfiguration VLAN's TITEL Inhaltsverzeichnis Inhaltsverzeichnis...

Mehr

Formular»Fragenkatalog BIM-Server«

Formular»Fragenkatalog BIM-Server« Formular»Fragenkatalog BIM-Server«Um Ihnen so schnell wie möglich zu helfen, benötigen wir Ihre Mithilfe. Nur Sie vor Ort kennen Ihr Problem, und Ihre Installationsumgebung. Bitte füllen Sie dieses Dokument

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

Die Dateiablage Der Weg zur Dateiablage

Die Dateiablage Der Weg zur Dateiablage Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen

Mehr

SGI 1200-Serverfamilie - Bekannte Probleme

SGI 1200-Serverfamilie - Bekannte Probleme SGI 1200-Serverfamilie - Bekannte Probleme In diesem Dokument werden Probleme und nicht standardmäßiges Funktionsverhalten behandelt, auf die Sie möglicherweise beim Installieren des SGI 1200-Servers bzw.

Mehr

How to install freesshd

How to install freesshd Enthaltene Funktionen - Installation - Benutzer anlegen - Verbindung testen How to install freesshd 1. Installation von freesshd - Falls noch nicht vorhanden, können Sie das Freeware Programm unter folgendem

Mehr

3 Windows als Storage-Zentrale

3 Windows als Storage-Zentrale 3 Windows als Storage-Zentrale Windows als zentrale Datenspeichereinheit punktet gegenüber anderen Lösungen vor allem bei der Integration in vorhandene Unternehmensnetze sowie bei der Administration. Dabei

Mehr

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar 2015. ZID Dezentrale Systeme

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar 2015. ZID Dezentrale Systeme Novell Client Anleitung zur Verfügung gestellt durch: ZID Dezentrale Systeme Februar 2015 Seite 2 von 8 Mit der Einführung von Windows 7 hat sich die Novell-Anmeldung sehr stark verändert. Der Novell Client

Mehr

EasyWk DAS Schwimmwettkampfprogramm

EasyWk DAS Schwimmwettkampfprogramm EasyWk DAS Schwimmwettkampfprogramm Arbeiten mit OMEGA ARES 21 EasyWk - DAS Schwimmwettkampfprogramm 1 Einleitung Diese Präsentation dient zur Darstellung der Zusammenarbeit zwischen EasyWk und der Zeitmessanlage

Mehr

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me Bevor Sie die Platte zum ersten Mal benutzen können, muss sie noch partitioniert und formatiert werden! Vorher zeigt sich die Festplatte

Mehr

Lizenzen auschecken. Was ist zu tun?

Lizenzen auschecken. Was ist zu tun? Use case Lizenzen auschecken Ihr Unternehmen hat eine Netzwerk-Commuterlizenz mit beispielsweise 4 Lizenzen. Am Freitag wollen Sie Ihren Laptop mit nach Hause nehmen, um dort am Wochenende weiter zu arbeiten.

Mehr

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11 Kurzanleitung MEYTON Aufbau einer Internetverbindung 1 Von 11 Inhaltsverzeichnis Installation eines Internetzugangs...3 Ist mein Router bereits im MEYTON Netzwerk?...3 Start des YAST Programms...4 Auswahl

Mehr

Lokale Installation von DotNetNuke 4 ohne IIS

Lokale Installation von DotNetNuke 4 ohne IIS Lokale Installation von DotNetNuke 4 ohne IIS ITM GmbH Wankelstr. 14 70563 Stuttgart http://www.itm-consulting.de Benjamin Hermann hermann@itm-consulting.de 12.12.2006 Agenda Benötigte Komponenten Installation

Mehr

Schritt-Schritt-Anleitung zum mobilen PC mit Paragon Drive Copy 10 und VMware Player

Schritt-Schritt-Anleitung zum mobilen PC mit Paragon Drive Copy 10 und VMware Player PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Stephan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0) 761 59018201 Fax +49 (0) 761 59018130 Internet www.paragon-software.com Email sales@paragon-software.com

Mehr

CA Übung 30.01.2006. Christian kann heute nicht kommen => ich bin heute da, Christian das nächste Mal wieder

CA Übung 30.01.2006. Christian kann heute nicht kommen => ich bin heute da, Christian das nächste Mal wieder CA Übung 30.01.2006 Hallo zusammen! Christian kann heute nicht kommen => ich bin heute da, Christian das nächste Mal wieder Adrian Schüpbach: scadrian@student.ethz.ch Christian Fischlin: cfischli@student.ethz.ch

Mehr

Kommunikations-Management

Kommunikations-Management Tutorial: Wie kann ich E-Mails schreiben? Im vorliegenden Tutorial lernen Sie, wie Sie in myfactory E-Mails schreiben können. In myfactory können Sie jederzeit schnell und einfach E-Mails verfassen egal

Mehr

Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht:

Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht: Beiträge erstellen in Joomla Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht: Abbildung 1 - Kontrollzentrum Von hier aus kann man zu verschiedene Einstellungen

Mehr

Installationsanleitung Maschinenkonfiguration und PP s. Release: VISI 21 Autor: Anja Gerlach Datum: 18. Dezember 2012 Update: 18.

Installationsanleitung Maschinenkonfiguration und PP s. Release: VISI 21 Autor: Anja Gerlach Datum: 18. Dezember 2012 Update: 18. Installationsanleitung Maschinenkonfiguration und PP s Release: VISI 21 Autor: Anja Gerlach Datum: 18. Dezember 2012 Update: 18.Februar 2015 Inhaltsverzeichnis 1 Einbinden der Postprozessoren... 3 1.1

Mehr

Einführung in die technische Informatik

Einführung in die technische Informatik Einführung in die technische Informatik Christopher Kruegel chris@auto.tuwien.ac.at http://www.auto.tuwien.ac.at/~chris Betriebssysteme Aufgaben Management von Ressourcen Präsentation einer einheitlichen

Mehr

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Nach dem Update auf die Version 1.70 bekommen Sie eine Fehlermeldung,

Mehr

Tutorial: Wie kann ich Dokumente verwalten?

Tutorial: Wie kann ich Dokumente verwalten? Tutorial: Wie kann ich Dokumente verwalten? Im vorliegenden Tutorial lernen Sie, wie Sie in myfactory Dokumente verwalten können. Dafür steht Ihnen in myfactory eine Dokumenten-Verwaltung zur Verfügung.

Mehr

Anbindung an easybill.de

Anbindung an easybill.de Anbindung an easybill.de Stand: 14. Dezember 2011 2011 Virthos Systems GmbH www.pixtacy.de Einleitung Pixtacy verfügt ab Version 2.3 über eine Schnittstelle zu dem Online-Fakturierungsprogramm easybill.de.

Mehr

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter Aufgabe 3: Konto Um Geldbeträge korrekt zu verwalten, sind zwecks Vermeidung von Rundungsfehlern entweder alle Beträge in Cents umzuwandeln und

Mehr

Version 0.3. Installation von MinGW und Eclipse CDT

Version 0.3. Installation von MinGW und Eclipse CDT Version 0.3 Installation von MinGW und Eclipse CDT 1. Stellen Sie fest, ob Sie Windows in der 32 Bit Version oder in der 64 Bit Version installiert haben. 2. Prüfen Sie, welche Java Runtime vorhanden ist.

Mehr

In 15 Schritten zum mobilen PC mit Paragon Drive Copy 11 und VMware Player

In 15 Schritten zum mobilen PC mit Paragon Drive Copy 11 und VMware Player PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Schritthan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0) 761 59018201 Fax +49 (0) 761 59018130 Internet www.paragon-software.com Email sales@paragon-software.com

Mehr

Hex Datei mit Atmel Studio 6 erstellen

Hex Datei mit Atmel Studio 6 erstellen Hex Datei mit Atmel Studio 6 erstellen Es werden generell keine Atmel Studio Dateien ins Repository geladen, da jeder seine Dateien an anderen Orten liegen hat und weil nicht jeder das Atmel Studio 6 benutzt.

Mehr

Fachhochschule Deggendorf Platzziffer:...

Fachhochschule Deggendorf Platzziffer:... Sommersemester 2008 Zahl der Blätter: 9 Fachbereich: Betriebswirtschaft WI Bachelor Hilfsmittel: alles ohne Computer Zeit: 90 Minuten 1 Betrachten Sie die drei markierten Zeilen. 1. Angenommen Sie hätten

Mehr

IRF2000 Application Note Lösung von IP-Adresskonflikten bei zwei identischen Netzwerken

IRF2000 Application Note Lösung von IP-Adresskonflikten bei zwei identischen Netzwerken Version 2.0 1 Original-Application Note ads-tec GmbH IRF2000 Application Note Lösung von IP-Adresskonflikten bei zwei identischen Netzwerken Stand: 27.10.2014 ads-tec GmbH 2014 IRF2000 2 Inhaltsverzeichnis

Mehr

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

Mehr

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet C++ Grundlagen ++ bedeutet Erweiterung zum Ansi C Standard Hier wird eine Funktion eingeleitet Aufbau: In dieser Datei stehen die Befehle, die gestartet werden, wenn das Programm gestartet wird Int main()

Mehr

Befehlssatz zum High Speed Interface-88-USB (HSI-88-USB) (ab Firmware 0.71) (Version 1.2)

Befehlssatz zum High Speed Interface-88-USB (HSI-88-USB) (ab Firmware 0.71) (Version 1.2) Kurzbeschreibung: Befehlssatz zum High Speed Interface-88-USB (HSI-88-USB) (ab Firmware 0.71) (Version 1.2) Beim HSI-88-USB handelt es sich um ein Interface vom s88-rückmeldebus zum Universal Serial Bus

Mehr

2 Die Terminaldienste Prüfungsanforderungen von Microsoft: Lernziele:

2 Die Terminaldienste Prüfungsanforderungen von Microsoft: Lernziele: 2 Die Terminaldienste Prüfungsanforderungen von Microsoft: Configuring Terminal Services o Configure Windows Server 2008 Terminal Services RemoteApp (TS RemoteApp) o Configure Terminal Services Gateway

Mehr

Handbuch PCI Treiber-Installation

Handbuch PCI Treiber-Installation Handbuch PCI Treiber-Installation W&T Release 1.0, September 2003 09/2003 by Wiesemann & Theis GmbH Microsoft und Windows sind eingetragene Warenzeichen der Microsoft Corporation Irrtum und Änderung vorbehalten:

Mehr

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff Programmieren in C Felder, Schleifen und Fließkommaarithmetik Prof. Dr. Nikolaus Wulff Addition von Zahlen 1 2 3 4 5 #include int main() { int x,y,z,sum; x = 1; y = 2; z = 4; sum = x + y + z;

Mehr

Adami CRM - Outlook Replikation User Dokumentation

Adami CRM - Outlook Replikation User Dokumentation Adami CRM - Outlook Replikation User Dokumentation Die neue Eigenschaft der Adami CRM Applikation macht den Information Austausch mit Microsoft Outlook auf vier Ebenen möglich: Kontakte, Aufgaben, Termine

Mehr

Guide DynDNS und Portforwarding

Guide DynDNS und Portforwarding Guide DynDNS und Portforwarding Allgemein Um Geräte im lokalen Netzwerk von überall aus über das Internet erreichen zu können, kommt man um die Themen Dynamik DNS (kurz DynDNS) und Portweiterleitung(auch

Mehr