\documentclass{beamer}
\usetheme{linutronix}
\usepackage{german}
\usepackage[utf8]{inputenc}
\usepackage{pgf}
\usepackage{graphicx}
\usepackage{psfrag}
\usepackage{listings}

\title{Interaktion eines Character Device Treibers}
\institute{Linutronix GmbH}

\begin{document}
\lstset{language=[ANSI]C, moredelim=[is][\color{blue}]{|}{|}}
\maketitle

% ----- Slide Syscalls ------------------
\begin{frame}
\frametitle{Syscall Interface}
\begin{center}
\includegraphics[width=5cm]{images/syscall.png}
\end{center}
\end{frame}

% ----- Slide Aufbau ------------------
\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}

% ----- Slide open ------------------
\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}

% ----- Slide release ------------------
\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}

% ----- Slide read ------------------
\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}

% ----- Slide write ------------------
\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}

% ----- Slide fsync ------------------
\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}

% ----- Slide llseek ------------------
\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}

% ----- Slide poll ------------------
\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}

% ----- Slide mmap ------------------
\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}

% ----- Slide ioctl ------------------
\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}

\end{document}
