\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}