summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ogness <john.ogness@linutronix.de>2018-02-20 15:33:14 +0100
committerJohn Ogness <john.ogness@linutronix.de>2018-02-20 15:33:14 +0100
commit0351969fdffa9959921d8ec38b7d0d7cf095fcd0 (patch)
tree168fe35c8d3324b11181098dd7c09d0fa409f88d
parentffce744d7d8a0f7a6846164bfc16fc0753683127 (diff)
remove german slides when english are available
Remove german slides if a completely translated english version is available. For slides that have been translated to english, but do not contain all the information of the german slides, the german slides are still available. But they are only available for reference. That will not be built. Signed-off-by: John Ogness <john.ogness@linutronix.de>
-rw-r--r--application-devel/debugging-tools/Makefile1
-rw-r--r--application-devel/embedded-devel/Makefile1
-rw-r--r--application-devel/embedded-devel/pres_embedded-devel_de.tex493
-rw-r--r--kernel-devel/char-device/Makefile1
-rw-r--r--kernel-devel/char-device/pres_char-device_de.tex287
-rw-r--r--kernel-devel/module-basics/Makefile1
-rw-r--r--kernel-devel/module-basics/pres_module-basics_de.tex523
-rw-r--r--linux-basics/boot-process/Makefile1
-rw-r--r--linux-basics/boot-process/pres_boot-process_de.tex95
-rw-r--r--realtime/rt-basics/Makefile1
-rw-r--r--realtime/rt-basics/pres_rt-basics_de.tex205
-rw-r--r--realtime/rt-specialties/Makefile1
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