diff options
| -rw-r--r-- | application-devel/debugging-tools/Makefile | 1 | ||||
| -rw-r--r-- | application-devel/embedded-devel/Makefile | 1 | ||||
| -rw-r--r-- | application-devel/embedded-devel/pres_embedded-devel_de.tex | 493 | ||||
| -rw-r--r-- | kernel-devel/char-device/Makefile | 1 | ||||
| -rw-r--r-- | kernel-devel/char-device/pres_char-device_de.tex | 287 | ||||
| -rw-r--r-- | kernel-devel/module-basics/Makefile | 1 | ||||
| -rw-r--r-- | kernel-devel/module-basics/pres_module-basics_de.tex | 523 | ||||
| -rw-r--r-- | linux-basics/boot-process/Makefile | 1 | ||||
| -rw-r--r-- | linux-basics/boot-process/pres_boot-process_de.tex | 95 | ||||
| -rw-r--r-- | realtime/rt-basics/Makefile | 1 | ||||
| -rw-r--r-- | realtime/rt-basics/pres_rt-basics_de.tex | 205 | ||||
| -rw-r--r-- | realtime/rt-specialties/Makefile | 1 |
12 files changed, 0 insertions, 1610 deletions
diff --git a/application-devel/debugging-tools/Makefile b/application-devel/debugging-tools/Makefile index 43ee821..acf7994 100644 --- a/application-devel/debugging-tools/Makefile +++ b/application-devel/debugging-tools/Makefile @@ -1,2 +1 @@ -obj-$(CONFIG_DEBUGGING_TOOLS) += pres_debugging-tools_de.pdf obj-$(CONFIG_DEBUGGING_TOOLS) += pres_debugging-tools_en.pdf diff --git a/application-devel/embedded-devel/Makefile b/application-devel/embedded-devel/Makefile index 336a755..08752ae 100644 --- a/application-devel/embedded-devel/Makefile +++ b/application-devel/embedded-devel/Makefile @@ -1,3 +1,2 @@ obj-$(CONFIG_DEVEL_EMBEDDED) += hints_embedded-devel_de.pdf -obj-$(CONFIG_DEVEL_EMBEDDED) += pres_embedded-devel_de.pdf obj-$(CONFIG_DEVEL_EMBEDDED) += pres_embedded-devel_en.pdf diff --git a/application-devel/embedded-devel/pres_embedded-devel_de.tex b/application-devel/embedded-devel/pres_embedded-devel_de.tex deleted file mode 100644 index e8f2e87..0000000 --- a/application-devel/embedded-devel/pres_embedded-devel_de.tex +++ /dev/null @@ -1,493 +0,0 @@ -\input{configpres} - -\title{\lq (Embedded) LINUX Applikationsentwicklung\rq} -\maketitle - -\begin{frame} -\frametitle{Übersicht} -\tableofcontents -\end{frame} - -\subsection{Der GNU Compiler} -\subsubsection{Hello world} -\begin{frame}[fragile] -\frametitle{Der GNU Compiler} -\begin{lstlisting}[language=c] -/* hello.c */ -#include <stdio.h> - -int main(void) -{ - printf("Hello world\n"); - return 0; -} -\end{lstlisting} -\begin{lstlisting}[language=bash] -# Uebersetzen des Testprogramms -gcc -o hello hello.c -\end{lstlisting} -\end{frame} - -\subsubsection{Wichtige Optionen} -\begin{frame}[fragile] -\frametitle{Wichtige gcc Optionen} -\begin{lstlisting}[language=bash] -# Nur Objectfile erzeugen -gcc -c -o hello.o hello.c - -# Uebersetzen mit Optimierungslevel 3 -gcc -O3 -o hello hello.c - -# Ohne Optimierung und mit -# Debugsymbolen uebersetzen -gcc -O0 -g hello hello.c -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Wichtige gcc Optionen} -\begin{lstlisting}[language=bash] -# Gegen zusaetzliche Bibliothek linken (librt.so) -gcc -lrt -o hello hello.c - -# Suchpfad fuer Bibliotheken hinzufuegen -gcc -L /mypath -lrt -o hello hello.c - -# Suchpfad fuer Includes hinzufuegen -gcc -I /mypath -o hello hello.c -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Wichtige gcc Optionen} -\begin{lstlisting}[language=bash] -# Alle Warnings ausgeben -gcc -Wall -o hello hello.c - -# Warnings als Fehler behandeln -gcc -Werror -o hello hello.c -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{GCC: Nützliches} -\begin{lstlisting}[language=bash] -# Vordefinierte / Interne Makros ausgeben -$ gcc -E -dM - < /dev/null | cut -c 9- | sort -[...] -__SIZEOF_DOUBLE__ 8 -__SIZEOF_FLOAT__ 4 -__SIZEOF_INT__ 4 -__SIZEOF_LONG__ 8 -[...] -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{GCC: Nützliches} -\begin{lstlisting}[language=bash] -# Nur Pre-Prozessor ausfuehren -$ gcc -C -E hello.c -o hello_pre - -# Woher kommt welches Symbol? -$ gcc -Wl,-y,printf hello.c -/lib/libc.so.6: definition of printf -\end{lstlisting} -Quelle und weitere nuetzliche Tipps: http://elinux.org/GCC\_Tips -\end{frame} - -\subsection{Der Dynamic Loader} -\begin{frame} -\frametitle{Der Dynamic Loader: ld-linux.so} -\begin{alertblock}{Was ist der Dynamic Loader?} -Der Dynamic Loader: ld-linux.so lädt die dynamischen Bibliotheken, die von einem Programm -benötigt werden. Er ist Bestandteil der C Bibliothek. -\end{alertblock} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Der Dynamic Loader: ld-linux.so} -\begin{lstlisting}[language=bash] -# Entweder -./hello - -# oder -/lib/ld-linux-x86-64.so.2 ./hello -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Der Dynamic Loader: Umgebungsvariablen} -\begin{tabular}{|l|p{5cm}|} -\hline -\textbf{Umgebungsvariable} & \textbf{Abkürzung} \\ -\hline -LD\_LIBRARY\_PATH & Suchpfad für Bibliotheken \\ -\hline -LD\_PRELOAD & Liste von Bibliotheken, die vor allen anderen zu laden sind \\ -\hline -LD\_DEBUG & Debug Ausgaben \\ -\hline -\end{tabular} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Der Dynamic Loader: Umgebungsvariablen} -\begin{lstlisting}[basicstyle=\ttfamily\fontsize{9}{9}\selectfont] -$ LD_DEBUG=help ./hello -Valid options for the LD_DEBUG environment -variable are: - - libs display library search paths - reloc display relocation processing - files display progress for input file - symbols display symbol table processing - bindings display information about symbol binding - versions display version dependencies - all all previous options combined - statistics display relocation statistics - unused determined unused DSOs - help display this help message and exit -\end{lstlisting} -\end{frame} - -\begin{frame} -\frametitle{Der Dynamic Loader: Suchreihenfolge} -\begin{enumerate} -\item DT\_RPATH dynamic subsection (ELF) -\item LD\_LIBRARY\_PATH -\item DT\_RUNPATH dynamic subsection (ELF) -\item ld.so.cache -\item /lib bzw. /usr/lib -\end{enumerate} -\end{frame} - -\subsection{Die Binutils} -\subsubsection{Übersicht} -\begin{frame} -\frametitle{Die Binutils} -Eine Sammlung von Programmen zum Erstellen / Bearbeiten von Binaries. -Die wichtigsten Tools sind: -\begin{itemize} -\item Der GNU Linker (ld) -\item Der GNU Assembler (as) -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Weitere Programme der Binutils} -\begin{itemize} -\item \textbf{addr2line}: Ordnet Adressen Zeilennummern zu -\item \textbf{gprof}: Profiler -\item \textbf{nm}: Listet Symbole in Objectfiles -\item \textbf{objcopy}: Kopiert und konvertiert Objectfiles -\item \textbf{objdump}: Listet Informationen zu Objectfiles -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Weitere Programme der Binutils} -\begin{itemize} -\item \textbf{ranlib}: Generiert den Index zu einem Archivinhalt -\item \textbf{readelf}: Zeigt Informationen zu ELF Files -\item \textbf{size}: Listet die Sektionsgrößen für Object- oder ELF Files -\item \textbf{strip}: Entfernt Symbole -\end{itemize} -\end{frame} - -\subsubsection{objdump} -\begin{frame}[containsverbatim] -\frametitle{Untersuchen von Binaries mit Objdump} -\begin{lstlisting}[language=bash] -jan@hopfropf:~$ objdump -x /bin/ls -/bin/ls: file format elf64-x86-64 -/bin/ls -architecture: i386:x86-64, flags 0x00000112: -EXEC_P, HAS_SYMS, D_PAGED -start address 0x0000000000402490 - -Program Header: - PHDR off 0x0000000000000040 vaddr [...] - filesz 0x00000000000001f8 memsz [...] -[...] -Dynamic Section: - NEEDED librt.so.1 -[...] -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Untersuchen von Binaries mit Objdump} -\begin{lstlisting}[language=bash] -Version References: - required from librt.so.1: - 0x09691a75 0x00 07 GLIBC_2.2.5 -[...] -Sections: -Idx Name Size VMA [...] - 0 .interp 0000001c 000000000040 [...] - CONTENTS, ALLOC, LOAD, [...] - 1 .note.ABI-tag 00000020 000000000040 [...] - CONTENTS, ALLOC, LOAD, [...] -[...] -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Bibliotheksabhängigkeiten mit objdump bestimmen} -\begin{lstlisting}[language=bash] -jan@hopfropf:~$ objdump -x /bin/ls | grep NEEDED - NEEDED librt.so.1 - NEEDED libselinux.so.1 - NEEDED libacl.so.1 - NEEDED libc.so.6 -\end{lstlisting} -\end{frame} - -\subsubsection{objcopy} -\begin{frame}[fragile] -\frametitle{Binaries bearbeiten mit objcopy} -\begin{lstlisting}[language=bash] -# 64bit ELF ins SREC Format kopieren -objcopy -I elf64-x86-64 -O srec hello hello.srec -# SREC in 64 bit ELF kopieren -objcopy -I srec -O elf64-x86-64 hello.srec hello -\end{lstlisting} -\end{frame} - -\subsubsection{addr2line} -\begin{frame}[containsverbatim] -\frametitle{Adressen zuordnen mit addr2line} -\begin{lstlisting}[language=bash] -objdump -D hello | less -\end{lstlisting} -\begin{verbatim} -[...] -000000000040050c <main>: - 40050c: 55 push %rbp - 40050d: 48 89 e5 mov %rsp,%rbp -[...] -\end{verbatim} -\begin{lstlisting}[language=bash] -$ addr2line -e hello 40050c -/home/jan/work/examples/hello.c:4 -\end{lstlisting} -\end{frame} - -\subsection{Bibliotheken} -\subsubsection{Statische Bibliotheken} -\begin{frame}[fragile] -\frametitle{Statische Bibliotheken} -\begin{lstlisting} -# Erstellen -$ gcc -c file1.c file2.c -$ ar r libhello.a file1.o file2.o -# Benutzen -$ gcc -o hello hello.o libhello.a -\end{lstlisting} -\end{frame} - -\subsubsection{Dynamische Bibliotheken} - -\begin{frame}[fragile] -\frametitle{Dynamische Bibliotheken} -\begin{lstlisting} -# Erstellen dynamischer Bibliotheken -$ gcc -c -fPIC file1.c file2.c -$ gcc -shared -o libhello.so file1.o file2.o -# Gegen die Bibliothek linken -$ gcc -o hello hello.c libhello.so -# Versuchen Sie nun das Programm zu starten -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Wir erinnern uns an den Dynamic Loader!} -Also, entweder LD\_LIBRARY\_PATH setzen, oder nach /lib bzw. /usr/lib -kopieren. -\end{frame} - -\begin{frame} -\frametitle{\textbf{P}osition \textbf{Independent} \textbf{Code}} -Die Option -fPIC bewirkt die Erzeugung von ''position independent code''. -Das heißt, es wird Code erzeugt, der zur Laufzeit an jeder beliebigen virtuellen -Adresse lauffähig ist. -\end{frame} - -\begin{frame}[fragile] -\frametitle{SONAME} -\begin{lstlisting} -# Erstellen dynamischer Bibliotheken -$ gcc -c -fPIC file1.c file2.c -$ gcc -shared -Wl,-soname,libsayhello.so \ - -o libhello.so file1.o file2.o -\end{lstlisting} -Die -soname Linker-Option bewirkt, daß beim Linken der Name -''libsayhello.so'' eingetragen wird. Das heißt der Loader -sucht beim Starten der Applikation nach einer Bibliothek mit -dem Namen ''libsayhello.so''. -\end{frame} - -\begin{frame} -\frametitle{Namensgebung} -\begin{itemize} -\item linker name -\item SONAME -\item real name -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Namensgebung} -\begin{verbatim} -libhello.so.1 -> libhello.so.1.0.2 -# New minor version -libhello.so.1 -> libhello.so.1.0.3 -# New Major version -libhello.so.2 -> libhello.so.2.0.1 -\end{verbatim} -SONAME beeinhaltet die Majornumber. Der Symbolic Link mit -der Majornumber(SONAME) zeigt normalerweise auf die Bibliotheksversion -mit der aktuellsten Minornumber (real name). -\end{frame} - -\begin{frame}[fragile] -\frametitle{Namensgebung} -\begin{verbatim} -libhello.so -> libhello.so.1 -\end{verbatim} -Oft wird auch ein Link ohne Versionsnummer angelegt, der auf die -aktuellste Majornumber Zeigt. Man spricht hier vom sogenannten -''linker name''. -\end{frame} - -\begin{frame}[fragile] -\frametitle{DT\_RPATH und DT\_RUNPATH} -\begin{lstlisting} -$ gcc -Wl,-rpath,/mypath -o hello hello.c \ - libhello.so -\end{lstlisting} --rpath erzeugt per Default DT\_RPATH. Um DT\_RUNPATH zu erzeugen, -benötigt man die Option --enable-new-dtags. Beispiel: -\begin{lstlisting} -$ gcc -Wl,--enable-new-dtags \ - -Wl,-rpath,/mypath \ - -o hello hello.c libhello.so -# Was faellt bei folgendem Kommando auf: -$ objdump -p hello | grep PATH -\end{lstlisting} -\end{frame} - -\subsection{Buildprozess automatisieren} -\subsubsection{Übersicht} - -\begin{frame} -\frametitle{GNU make} -\begin{alertblock}{Was ist GNU make?} -GNU make kontrolliert und automatisiert Buildprozesse. -\end{alertblock} -\end{frame} - -\subsubsection{Anwendungsbeispiele} -\begin{frame}[containsverbatim] -\frametitle{Einfaches Beispiel} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -# Makefile - -hello: hello.o - gcc -o $@ $< - -hello.o: hello.c - gcc -c -o $@ $< - -clean: - rm -rf hello hello.o -\end{lstlisting} -\end{frame} - -\begin{frame} -\frametitle{Aufgabe} -\begin{itemize} -\item Erstellen Sie ein Beispielprojekt mit einem Hallo Welt Programm und dem -im Beispiel aufgeführten Makefile -\item Übersetzen Sie das Programm -\item Erstellen Sie eine Datei mit dem Namen clean und führen make clean aus -(Was passiert?!) -\end{itemize} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Problem} -\begin{lstlisting}[language=bash] -$ make -gcc -c -o hello.o hello.c -gcc -o hello hello.o -$ touch clean -$ make clean -make: `clean' is up to date. -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{PHONY targets} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -hello: hello.o - gcc -o $@ $< - -hello.o: hello.c - gcc -c -o $@ $< - -.PHONY: clean - -clean: - rm -rf hello hello.o -\end{lstlisting} -Aufgabe: Erweitern Sie Ihr Makefile um das PHONY target und führen Sie erneut -make clean aus. -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Regeln mit Pattern} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -hello: hello.o - gcc -o $@ $< - -%.o: %.c - gcc -c -o $@ $< - -.PHONY: clean - -clean: - rm -rf hello hello.o -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Variablen} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -EXE = hello -OBJ = $(EXE).o - -$(EXE): $(OBJ) - gcc -o $@ $< - -%.o: %.c - gcc -c -o $@ $< - -.PHONY: clean - -clean: - rm -rf $(EXE) $(OBJ) -\end{lstlisting} -\end{frame} - -\begin{frame}[containsverbatim] -\frametitle{Pattern substitution} -\begin{lstlisting}[language=make,showtabs=true,tabsize=4,tab=\rightarrowfill] -SRC = hello.c hello1.c -OBJ = $(SRC:%.c=%.o) -[...] -\end{lstlisting} -\end{frame} - -\input{tailpres} diff --git a/kernel-devel/char-device/Makefile b/kernel-devel/char-device/Makefile index 094719f..f5ce0ab 100644 --- a/kernel-devel/char-device/Makefile +++ b/kernel-devel/char-device/Makefile @@ -1,3 +1,2 @@ obj-$(CONFIG_KERNEL_CHAR_DEV) += hints_char-device_de.pdf -obj-$(CONFIG_KERNEL_CHAR_DEV) += pres_char-device_de.pdf obj-$(CONFIG_KERNEL_CHAR_DEV) += pres_char-device_en.pdf diff --git a/kernel-devel/char-device/pres_char-device_de.tex b/kernel-devel/char-device/pres_char-device_de.tex deleted file mode 100644 index 6568af4..0000000 --- a/kernel-devel/char-device/pres_char-device_de.tex +++ /dev/null @@ -1,287 +0,0 @@ -\input{configpres} - -\title{Interaktion eines Character Device Treibers} -\maketitle - -\subsection{Character Devices} - -\subsubsection{Syscall Interface} -\begin{frame} -\frametitle{Syscall Interface} -\begin{center} -\includegraphics[width=5cm]{images/syscall.png} -\end{center} -\end{frame} - -\subsubsection{Struktur} -\begin{frame} -\frametitle{Interaktion eines Character Device Treibers} -\pause -\begin{itemize} -\item open -\pause -\item release -\pause -\item read -\pause -\item write -\pause -\item fsync -\pause -\item llseek -\pause -\item poll -\pause -\item mmap -\pause -\item ioctl -\pause -\item \dots -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{open} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -int (*open) (struct inode *, struct file *); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [open:] Erste Operation auf einem Character-Device. Die Funktion muss -nicht implementiert werden. In diesem Fall schlägt ein Öffnen des Devices nie -fehl und es gibt keine Benachrichtigung des Treibers. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/open.png} -\end{center} -\end{frame} - -\begin{frame}[fragile] -\frametitle{release} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -int (*release) (struct inode *, struct file *); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [release:] Letzte Operation auf einem Character-Device. Die Funktion muss -nicht implementiert werden. In diesem Fall schlägt ein Öffnen des Devices nie -fehl und es gibt keine Benachrichtigung des Treibers. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/release.png} -\end{center} -\end{frame} - -\begin{frame}[fragile] -\frametitle{read} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [read:] Lesen von Daten des Devices. Die Daten werden mit Hilfe von -\emph{copy\_to\_user} in den Userspace kopiert. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/read.png} -\end{center} -\end{frame} - -\begin{frame}[fragile] -\frametitle{write} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [write:] Schreiben von Daten an das Devices. Die Daten werden mit Hilfe -von \emph{copy\_from\_user} aus dem Userspace kopiert. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/write.png} -\end{center} -\end{frame} - -\begin{frame}[fragile] -\frametitle{fsync} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -int (*fsync) (struct file *, struct dentry *, int datasync); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [fsync:] Das Schreiben aller gecachten Daten eines Devices erzwingen. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/fsync.png} -\end{center} -\end{frame} - -\begin{frame}[fragile] -\frametitle{llseek} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -loff_t (*llseek) (struct file *, loff_t, int); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [llseek:] Setzt die aktuelle Position für Lese- und Schreibzugriffe. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/llseek.png} -\end{center} -\end{frame} - -\begin{frame}[fragile] -\frametitle{poll} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -unsigned int (*poll) (struct file *, struct poll_table_struct *); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [poll:] Implementiert poll, epoll und select. Wird poll nicht -implementiert, so muss nicht blockierendes Lesen und Schreiben möglich sein. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/poll.png} -\end{center} -\end{frame} - -\begin{frame}[fragile] -\frametitle{mmap} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -int (*mmap) (struct file *, struct vm_area_struct *); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [mmap:] Legt ein Speichermapping des Devices im Kontext des -Userspace-Prozesses an. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/mmap.png} -\end{center} -\end{frame} - -\begin{frame}[fragile] -\frametitle{ioctl} -\pause -\begin{itemize} -\item Prototyp -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); -\end{lstlisting} -\end{tiny} -\pause -\item Beschreibung -\pause -\begin{description} -\item [ioctl:] Implementiert Device-spezifische Kommandos. Sollte, da in den -meisten Fällen bessere, standartisierte Schnittstellen existieren, vermieden -werden. -\end{description} -\pause -\item Datenfluss -\end{itemize} -\pause -\begin{center} -\includegraphics[width=5cm]{images/ioctl.png} -\end{center} -\end{frame} - -\input{tailpres} diff --git a/kernel-devel/module-basics/Makefile b/kernel-devel/module-basics/Makefile index 82017d4..952b311 100644 --- a/kernel-devel/module-basics/Makefile +++ b/kernel-devel/module-basics/Makefile @@ -1,2 +1 @@ -obj-$(CONFIG_KERNEL_MODULES_BASIC) += pres_module-basics_de.pdf obj-$(CONFIG_KERNEL_MODULES_BASIC) += pres_module-basics_en.pdf diff --git a/kernel-devel/module-basics/pres_module-basics_de.tex b/kernel-devel/module-basics/pres_module-basics_de.tex deleted file mode 100644 index e303cca..0000000 --- a/kernel-devel/module-basics/pres_module-basics_de.tex +++ /dev/null @@ -1,523 +0,0 @@ -\input{configpres} - -\title{Treiber Modul Grundlagen} -\maketitle - -\subsection{Kernel Module} - -\subsubsection{Aufbau} -\begin{frame}[fragile] -\frametitle{Aufbau eines Treiber Moduls} -\pause -\begin{itemize} -\item Header -\pause -\begin{scriptsize} -\begin{lstlisting}[frame=trBL] -#include <linux/init.h> -#include <linux/module.h> -\end{lstlisting} -\end{scriptsize} -\pause -\item Init -\pause -\begin{scriptsize} -\begin{lstlisting}[frame=trBL] -static int __init vain_init(void) -{ - printk(KERN_INFO "vain_init: done\n"); - return 0; -} - -module_init(vain_init); -\end{lstlisting} -\end{scriptsize} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau (fort.)} -\begin{itemize} -\item Exit -\pause -\begin{scriptsize} -\begin{lstlisting}[frame=trBL] -static void __exit vain_exit(void) -{ - printk(KERN_INFO "vain_exit: done\n"); -} - -module_exit(vain_exit); -\end{lstlisting} -\end{scriptsize} -\pause -\item Beschreibung -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -MODULE_AUTHOR("Benedikt Spranger <b.spranger@linutronix.de>"); -MODULE_DESCRIPTION("a more or less useless module"); -MODULE_LICENSE("GPL v2"); -MODULE_VERSION("0815"); -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\subsubsection{Rumpf Treiber} -\begin{frame}[fragile] -\frametitle{Rumpf Treiber} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain/vain.c} -\end{tiny} -\end{frame} - -\subsubsection{Makefile} -\begin{frame}[fragile] -\frametitle{Makefile} -\begin{scriptsize} -\lstinputlisting[language=make]{kernel-devel/module-basics/vain/Makefile} -\end{scriptsize} -\end{frame} - -\subsubsection{Bauen und Laden} -\begin{frame}[fragile] -\frametitle{Bauen, laden und entladen des Moduls} -\begin{itemize} -\item Bauen -\pause -\begin{tiny} -\begin{verbatim} -$ make -make -C /lib/modules/2.6.30/build M=/path/to/vain modules -make[1]: Entering directory `/usr/src/linux-2.6.30' - CC [M] /path/to/vain/vain.o - Building modules, stage 2. - MODPOST 1 modules - CC /path/to/vain/vain.mod.o - LD [M] /path/to/vain/vain.ko -make[1]: Leaving directory `/usr/src/linux-2.6.30' -$ -\end{verbatim} -\end{tiny} -\pause -\item Laden -\pause -\begin{tiny} -\begin{verbatim} -# insmod ./vain.ko -vain_init: done -# -\end{verbatim} -\end{tiny} -\item Entladen -\pause -\begin{tiny} -\begin{verbatim} -# rmmod vain -vain_exit: done -# -\end{verbatim} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Komplexere Module} -\pause -\begin{itemize} -\item Teil eines Bussystems -\pause -\begin{itemize} -\item PCI -\pause -\item Platform -\pause -\item USB -\pause -\item \dots -\pause -\end{itemize} -\item Teil eines Subsystems\footnote{nicht Teil des Vortrages} -\pause -\begin{itemize} -\item Character-Devices -\pause -\item Block-Devices -\pause -\item Network-Devices -\pause -\item \dots -\end{itemize} -\end{itemize} -\end{frame} - -\subsubsection{PCI Treiber Modul} -\begin{frame}[fragile] -\frametitle{Aufbau eines PCI Treiber Moduls} -\pause -\begin{itemize} -\item Header -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -#include <linux/init.h> -#include <linux/module.h> -|#include <linux/pci.h>| -\end{lstlisting} -\end{tiny} -\pause -\item Init -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -static int __init vain_pci_init(void) -{ - int err; - - |err = pci_register_driver(&vain_pci_driver);| - - if (!err) - printk(KERN_INFO "vain_pci_init: done\n"); - return err; -} - -module_init(vain_pci_init); -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines PCI Treiber Moduls (fort.)} -\begin{itemize} -\item Exit -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -static void __exit vain_pci_exit(void) -{ - |pci_unregister_driver(&vain_pci_driver);| - printk(KERN_INFO ``vain_pci_exit: done\n''); -} - -module_exit(vain_pci_exit); -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines PCI Treiber Moduls (fort.)} -\begin{itemize} -\item struct pci\_driver -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -|static struct pci_driver vain_pci_driver = { - .name = "vain_pci", - .id_table = vain_pci_ids, - .probe = vain_pci_probe, - .remove = __devexit_p(vain_pci_remove), -};| -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines PCI Treiber Moduls (fort.)} -\begin{itemize} -\item struct struct pci\_device\_id -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -|static struct pci_device_id vain_pci_ids[] __devinitdata = { - {PCI_VENDOR_ID_ILLEGAL_VENDOR, PCI_DEVICE_ID_ILLEGAL_VENDOR_DEVICE, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - {0, } -};| -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines PCI Treiber Moduls (fort.)} -\begin{itemize} -\item probe -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -|static int __devinit vain_pci_probe(struct pci_dev *pdev, - const struct pci_device_id *ent) -{ - int ret; - - ret = pci_enable_device(pdev); - if (ret) - goto err_free; - - ret = pci_request_regions(pdev, "vain_pci"); - if (ret) - goto err_disable_device; - - info->base = pci_ioremap_bar(pdev, 0); - if (!info->base) { - ret = -ENODEV; - goto err_rel_regs; - } - - return 0;| -\end{lstlisting} -\dots -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines PCI Treiber Moduls (fort.)} -\begin{itemize} -\item remove -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -|static void __devexit vain_pci_remove(struct pci_dev *pdev) -{ - struct vain_pci_info *info = pci_get_drvdata(pdev); - - iounmap(info->base); - pci_release_regions(pdev); - pci_disable_device(pdev); - pci_set_drvdata(pdev, NULL); - - kfree (info); -}| -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{PCI Treiber Hintergrund} -\includegraphics[width=7cm]{images/PCI_driver.png} -\end{frame} - -\begin{frame}[fragile] -\frametitle{PCI Rumpf Treiber} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_pci/vain_pci_1.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{PCI Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_pci/vain_pci_2.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{PCI Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_pci/vain_pci_3.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{PCI Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_pci/vain_pci_4.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{PCI Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_pci/vain_pci_5.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{PCI Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_pci/vain_pci_6.c} -\end{tiny} -\end{frame} - -\subsubsection{Platform Treiber Modul} -\begin{frame}[fragile] -\frametitle{Aufbau eines Platform Treiber Moduls} -\pause -\begin{itemize} -\item Header -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -#include <linux/init.h> -#include <linux/module.h> -|#include <linux/platform_device.h> - -#include <asm/io.h>| -\end{lstlisting} -\end{tiny} -\pause -\item Init -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -static int __init vain_plat_init(void) -{ - int err; - - |err = platform_driver_register(&vain_plat_driver);| - - if (!err) - printk(KERN_INFO ``vain_plat_init: done\n''); - return err; -} -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines Platform Treiber Moduls (fort.)} -\pause -\begin{itemize} -\item Exit -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -static void __exit vain_plat_exit(void) -{ - |platform_driver_unregister(&vain_plat_driver);| - printk(KERN_INFO ``vain_plat_exit: done\n''); -} -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines Platform Treiber Moduls (fort.)} -\pause -\begin{itemize} -\item struct platform\_driver -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -|static struct platform_driver vain_plat_driver = { - .driver = { - .name = "vain_plat", - .owner = THIS_MODULE, - }, - .probe = vain_plat_probe, - .remove = __devexit_p(vain_plat_remove), -};| -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines Platform Treiber Moduls (fort.)} -\pause -\begin{itemize} -\item probe -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -|static int __devinit vain_plat_probe(struct platform_device *pdev) -{ - struct resource *res; - int err; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (unlikely(!res)) - goto err_free; - - mem = request_mem_region(res->start, resource_size(res), pdev->name); - if (!mem) - goto err_free; - - info->base = ioremap(res->start, resource_size(res)); - if (!info->base) - goto err_ioremap; - - platform_set_drvdata(pdev, info); - - return 0;| -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Aufbau eines Platform Treiber Moduls (fort.)} -\pause -\begin{itemize} -\item remove -\pause -\begin{tiny} -\begin{lstlisting}[frame=trBL] -|static int __devexit vain_plat_remove(struct platform_device *pdev) -{ - struct vain_plat_info *info = platform_get_drvdata(pdev); - struct resource *res; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - iounmap(info->base); - release_mem_region(res->start, resource_size(res)); - platform_set_drvdata(pdev, NULL); - - kfree (info); - - return 0; -}| -\end{lstlisting} -\end{tiny} -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Platform Treiber Hintergrund} -\includegraphics[width=7cm]{images/plat_driver.png} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Platform Rumpf Treiber} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_plat/vain_plat_1.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Platform Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_plat/vain_plat_2.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Platform Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_plat/vain_plat_3.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Platform Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_plat/vain_plat_4.c} -\end{tiny} -\end{frame} - -\begin{frame}[fragile] -\frametitle{Platform Rumpf Treiber (fort.)} -\begin{tiny} -\lstinputlisting{kernel-devel/module-basics/vain_plat/vain_plat_5.c} -\end{tiny} -\end{frame} - -\input{tailpres} diff --git a/linux-basics/boot-process/Makefile b/linux-basics/boot-process/Makefile index 1387084..8dc70e0 100644 --- a/linux-basics/boot-process/Makefile +++ b/linux-basics/boot-process/Makefile @@ -1,4 +1,3 @@ obj-$(CONFIG_LINUX_BOOT_PROCESS) += hints_boot-process_de.pdf -obj-$(CONFIG_LINUX_BOOT_PROCESS) += pres_boot-process_de.pdf obj-$(CONFIG_LINUX_BOOT_PROCESS) += pres_boot-process_en.pdf obj-handout-$(CONFIG_LINUX_BOOT_PROCESS) += handout_boot-process_de.pdf diff --git a/linux-basics/boot-process/pres_boot-process_de.tex b/linux-basics/boot-process/pres_boot-process_de.tex deleted file mode 100644 index 1904fd5..0000000 --- a/linux-basics/boot-process/pres_boot-process_de.tex +++ /dev/null @@ -1,95 +0,0 @@ -\input{configpres} - -\title{Der Linux-Boot-Prozess} -\maketitle - -\subsection{Boot Prozess} - -\subsubsection{Problematik} -\begin{frame} -\frametitle{Aufgaben des Bootloaders} -\begin{itemize} -\item Low-Level-Initialisierung: -\pause -\item Clocks (CPU, PLLs, Peripherie...) -\pause -\item Speicher (DRAM-Controller, NAND-Controller...) -\pause -\item serielle Schnittstelle -\pause -\end{itemize} -\end{frame} - -\subsubsection{Bootloader} -\begin{frame} -\frametitle{Gängige Bootloader} -\begin{itemize} -\item U-Boot -\pause -\item Redboot -\pause -\item Konzept aus IPL+Bootkernel -\end{itemize} -\end{frame} - -\subsubsection{Struktur} -\begin{frame} -\frametitle{Ablauf des Bootprozesses} -\begin{itemize} -\item Bootloader initialisiert Hardware -\pause -\item Bootloader lädt Kernel -\pause -\item Bootloader springt Kernel an -\pause -\item Dabei Übergabe von Parametern an Kernel -\pause -\item Kernel initialsiert Hardware, Treiber -\pause -\item Kernel mountet Root-Filesystem -\pause -\item Kernel startet '/sbin/init' -\pause -\item 'init' liest '/etc/inittab', startet Skripte -\end{itemize} -\end{frame} - -\subsubsection{Stolperstellen} -\begin{frame} -\frametitle{Bootprobleme: 1. Im Bootloader} -\begin{itemize} -\item Bootloader nicht korrekt ins Flash geschrieben -\pause -\item falsche DRAM/NAND-Timings -\pause -\item Ladeadresse für Kernel nicht korrekt -\pause -\item Bei TFTP-Boot: IP-Adresse nicht korrekt -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Bootprobleme: 2. Im Kernel} -\begin{itemize} -\item Bootloader hinterlässt falsch initialisierte Hardware -\pause -\item Bootloader übergibt falsche Parameter -\pause -\item Treiber für Rootfs nicht im Kernel -\pause -\item Im Rootfs fehlen Device-Nodes -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Bootprobleme: 3. In den Startskripten} -\begin{itemize} -\item Im Rootfs fehlen Device-Nodes -\pause -\item Im Rootfs fehlen nötige Programme bzw. symlinks -\pause -\item Startskripte können nicht mit jeder Situation umgehen -\end{itemize} -\end{frame} - -\input{tailpres} diff --git a/realtime/rt-basics/Makefile b/realtime/rt-basics/Makefile index c92d852..cc1fbdf 100644 --- a/realtime/rt-basics/Makefile +++ b/realtime/rt-basics/Makefile @@ -1,3 +1,2 @@ -obj-$(CONFIG_REALTIME_BASICS) += pres_rt-basics_de.pdf obj-$(CONFIG_REALTIME_BASICS) += pres_rt-basics_en.pdf obj-handout-$(CONFIG_REALTIME_BASICS) += handout_rt-basics_de.pdf diff --git a/realtime/rt-basics/pres_rt-basics_de.tex b/realtime/rt-basics/pres_rt-basics_de.tex deleted file mode 100644 index 66a78eb..0000000 --- a/realtime/rt-basics/pres_rt-basics_de.tex +++ /dev/null @@ -1,205 +0,0 @@ -\input{configpres} - -\title{Block \lq Realtime Linux\rq} -\maketitle - -\subtitle{Echtzeit} - -\begin{frame} -\frametitle{Was ist Echtzeit?} -\begin{itemize} -\item Korrektheit bedeutet auch Ausführung zum korrekten Zeitpunkt -\item Nicht Einhalten des korrekten Zeitrahmens führt zu einem Fehler -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Echtzeit ''anschaulich''} -\begin{overprint} -\onslide<1> -\begin{alertblock}{Wir erinnern uns} -Nicht Einhalten des korrekten Zeitrahmens führt zu einem Fehler! -\end{alertblock} -\onslide<2> -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/nuclear.png} -\end{figure} -\end{overprint} -\end{frame} - -\begin{frame} -\frametitle{Anwendungsbereiche} -\begin{itemize} -\item Steuerungs- / Automatisierungstechnik -\item Multimediasysteme -\item Luft- und Raumfahrttechnik -\item Finanzdienstleistung -\item ... -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Anforderungen} -\begin{itemize} -\item Deterministisches Zeitverhalten -\item Unterbrechbarkeit -\item Priority Inheritance / Priority Ceiling -\end{itemize} -\end{frame} - -\subsubsection{Priority Inversion} -\begin{frame} -\frametitle{Priority Inversion} -\begin{figure}[h] -\centering -\includegraphics[width=0.8\textwidth]{images/prio_inv.png} -\end{figure} -\end{frame} - -\subsubsection{Linux und Echtzeit} -\begin{frame} -\frametitle{Linux und Echtzeit} -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/gpos_vs_rt.png} -\end{figure} -\end{frame} - -\begin{frame} -\frametitle{Ansätze} -\begin{itemize} -\item Dual-Kernel -\item In-Kernel / Single Kernel -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Dual-Kernel} -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/dual_kernel.png} -\end{figure} -\end{frame} - -\begin{frame} -\frametitle{Single-Kernel} -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/single_kernel.png} -\end{figure} -\end{frame} - -\begin{frame} -\frametitle{RTAI} -\begin{itemize} -\item Prof. Paolo Mantegazza, Universität Mailand -\item Dual-Kernel Ansatz -\item Echtzeit im Kernelspace -\item Userspace Echtzeittasks nur eingeschränkt möglich -\item Oberstes Designziel: Möglichst niedrige Latenzzeiten -\item Unterstützte Plattformen: x86, x86\_64, einige ARM Plattformen -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{RTAI} -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/rtai.png} -\end{figure} -\end{frame} - -\begin{frame} -\frametitle{Xenomai} -\begin{itemize} -\item Gegründet 2001 -\item Echtzeit im Userpace -\item Skins bilden API verschiedenster RTOSse nach -\item Dual-Kernel Ansatz -\item Unterstützte Plattformen: x86, x86\_64, PowerPC, ARM, ia64 -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Xenomai} -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/xenomai.png} -\end{figure} -\end{frame} - -\begin{frame} -\frametitle{Xenomai / IPIPE} -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/ipipe.png} -\end{figure} -\end{frame} - -\begin{frame} -\frametitle{Drum prüfe, wer sich ewig bindet...} -\begin{overprint} -\onslide<1> -\begin{figure}[h] -\centering -\includegraphics[width=0.8\textwidth]{images/mar01.png} -\end{figure} -\onslide<2> -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/mar02.png} -\end{figure} -\onslide<3> -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/mar03.png} -\end{figure} -\end{overprint} -\end{frame} - -\begin{frame} -\frametitle{Preempt RT} -\begin{itemize} -\item Thomas Gleixner, Ingo Molnar -\item In-Kernel Ansatz -\item Große Entwicklergemeinde -\item Viele Funktionen bereits nach ''Mainline'' Linux übernommen -\item POSIX Realtime -\item Hohe Akzeptanz, vollständige Integration in Linux 2006 beschlossen -\end{itemize} -\end{frame} - -\begin{frame} -\frametitle{Preempt RT und Mainline} -\textit{''Controlling a laser with Linux is crazy, but everyone in this room is -crazy in his own way. So if you want to use Linux to control an industrial -welding laser, I have no problem with your using Preempt RT''} - Linus Torvalds -auf dem Kernel Summit 2006 -\end{frame} - -\begin{frame} -\frametitle{Wie macht Preempt RT Linux echtzeitfähig?} -\begin{overprint} -\onslide<1> -\begin{alertblock}{Wir erinnern uns...} -Unterbrechbarkeit ist eine zentrale Anforderung an ein Echtzeitsystem -\end{alertblock} -\onslide<2> -\begin{itemize} -\item Locking Primitiven: Spinlocks werden durch RT Mutexe ersetzt, die schlafen -können. Raw Spinlocks ersetzen die ursprüngliche Spinlock -\item Interrupt Handler laufen per default in einem Kernelthread -\end{itemize} -\end{overprint} -\end{frame} - -\begin{frame} -\frametitle{Preempt RT} -\begin{figure}[h] -\centering -\includegraphics[height=0.5\textwidth]{images/preempt_rt.png} -\end{figure} -\end{frame} - -\input{tailpres} diff --git a/realtime/rt-specialties/Makefile b/realtime/rt-specialties/Makefile index 11da55f..4d11316 100644 --- a/realtime/rt-specialties/Makefile +++ b/realtime/rt-specialties/Makefile @@ -1,4 +1,3 @@ obj-$(CONFIG_REALTIME_SPECIALITIES) += hints_rt-specialties_de.pdf -obj-$(CONFIG_REALTIME_SPECIALITIES) += pres_rt-specialties_de.pdf obj-$(CONFIG_REALTIME_SPECIALITIES) += pres_rt-specialties_en.pdf obj-handout-$(CONFIG_REALTIME_SPECIALITIES) += handout_rt-specialties_de.pdf |
