diff options
24 files changed, 126 insertions, 259 deletions
@@ -1,5 +1,5 @@ -SUBDIRS = application-devel flash-memory frameworks -#kernel-devel linux-basics realtime protocols +SUBDIRS = application-devel flash-memory frameworks kernel-devel +#linux-basics realtime protocols default: make all @@ -18,8 +18,8 @@ book:: touch tailpres.tex mv tailhandout.tex _tailhandout.tex touch tailhandout.tex - #pdflatex pres_master.tex - #pdflatex pres_master.tex + pdflatex pres_master.tex + pdflatex pres_master.tex pdflatex handout_master.tex pdflatex handout_master.tex rm configpres.tex confighandout.tex tailpres.tex tailhandout.tex diff --git a/handout_master.tex b/handout_master.tex index f5ccb3a..d9fdf1d 100644 --- a/handout_master.tex +++ b/handout_master.tex @@ -9,4 +9,8 @@ \section{Flashspeicher} \input{./flash-memory/mtd/handout_mtd_de.tex} \input{./flash-memory/ubi/handout_ubi_de.tex} +\section{Treiberentwicklung} +\input{./kernel-devel/kernel-basics/handout_kernel-basics_de.tex} +\input{./kernel-devel/kernel-build/handout_kernel-build_de.tex} +\input{./kernel-devel/uio-driver/handout_uio-driver_de.tex} \input{tailmasterhandout} diff --git a/kernel-devel/Makefile b/kernel-devel/Makefile index c0c47ad..0a202ea 100644 --- a/kernel-devel/Makefile +++ b/kernel-devel/Makefile @@ -1,4 +1,4 @@ -SUBDIRS = `ls -1 | grep -v *.tex | grep -v Makefile` +SUBDIRS = `ls -1 | grep -v *.tex | grep -v Makefile | grep -v TODO` all clean:: for dir in $(SUBDIRS) ; do \ diff --git a/kernel-devel/TODO b/kernel-devel/TODO new file mode 100644 index 0000000..3f5e022 --- /dev/null +++ b/kernel-devel/TODO @@ -0,0 +1,3 @@ +- driver_basics, see hint file +- best_practices, see hint file +- some handouts diff --git a/kernel-devel/char-device/Makefile b/kernel-devel/char-device/Makefile index 4663d52..d641258 100644 --- a/kernel-devel/char-device/Makefile +++ b/kernel-devel/char-device/Makefile @@ -1,7 +1,7 @@ all: for pdf in `ls -1 *.tex` ; do \ - pdflatex $$pdf; \ - pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ done clean: diff --git a/kernel-devel/char-device/pres_char-device_de.tex b/kernel-devel/char-device/pres_char-device_de.tex index 7df54c5..6568af4 100644 --- a/kernel-devel/char-device/pres_char-device_de.tex +++ b/kernel-devel/char-device/pres_char-device_de.tex @@ -1,20 +1,11 @@ -\documentclass{beamer} -\usetheme{linutronix} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{pgf} -\usepackage{graphicx} -\usepackage{psfrag} -\usepackage{listings} +\input{configpres} \title{Interaktion eines Character Device Treibers} -\institute{Linutronix GmbH} - -\begin{document} -\lstset{language=[ANSI]C, moredelim=[is][\color{blue}]{|}{|}} \maketitle -% ----- Slide Syscalls ------------------ +\subsection{Character Devices} + +\subsubsection{Syscall Interface} \begin{frame} \frametitle{Syscall Interface} \begin{center} @@ -22,7 +13,7 @@ \end{center} \end{frame} -% ----- Slide Aufbau ------------------ +\subsubsection{Struktur} \begin{frame} \frametitle{Interaktion eines Character Device Treibers} \pause @@ -49,7 +40,6 @@ \end{itemize} \end{frame} -% ----- Slide open ------------------ \begin{frame}[fragile] \frametitle{open} \pause @@ -78,7 +68,6 @@ fehl und es gibt keine Benachrichtigung des Treibers. \end{center} \end{frame} -% ----- Slide release ------------------ \begin{frame}[fragile] \frametitle{release} \pause @@ -107,7 +96,6 @@ fehl und es gibt keine Benachrichtigung des Treibers. \end{center} \end{frame} -% ----- Slide read ------------------ \begin{frame}[fragile] \frametitle{read} \pause @@ -135,7 +123,6 @@ ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); \end{center} \end{frame} -% ----- Slide write ------------------ \begin{frame}[fragile] \frametitle{write} \pause @@ -163,7 +150,6 @@ von \emph{copy\_from\_user} aus dem Userspace kopiert. \end{center} \end{frame} -% ----- Slide fsync ------------------ \begin{frame}[fragile] \frametitle{fsync} \pause @@ -190,7 +176,6 @@ int (*fsync) (struct file *, struct dentry *, int datasync); \end{center} \end{frame} -% ----- Slide llseek ------------------ \begin{frame}[fragile] \frametitle{llseek} \pause @@ -217,7 +202,6 @@ loff_t (*llseek) (struct file *, loff_t, int); \end{center} \end{frame} -% ----- Slide poll ------------------ \begin{frame}[fragile] \frametitle{poll} \pause @@ -245,7 +229,6 @@ implementiert, so muss nicht blockierendes Lesen und Schreiben möglich sein. \end{center} \end{frame} -% ----- Slide mmap ------------------ \begin{frame}[fragile] \frametitle{mmap} \pause @@ -273,7 +256,6 @@ Userspace-Prozesses an. \end{center} \end{frame} -% ----- Slide ioctl ------------------ \begin{frame}[fragile] \frametitle{ioctl} \pause @@ -302,4 +284,4 @@ werden. \end{center} \end{frame} -\end{document} +\input{tailpres} diff --git a/kernel-devel/driver-basics/Makefile b/kernel-devel/driver-basics/Makefile new file mode 100644 index 0000000..d641258 --- /dev/null +++ b/kernel-devel/driver-basics/Makefile @@ -0,0 +1,9 @@ +all: + for pdf in `ls -1 *.tex` ; do \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + done + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/kernel-devel/driver-basics/handout_driver-basics_de.tex b/kernel-devel/driver-basics/handout_driver-basics_de.tex deleted file mode 100644 index 4c391b2..0000000 --- a/kernel-devel/driver-basics/handout_driver-basics_de.tex +++ /dev/null @@ -1,17 +0,0 @@ -\documentclass{article} -\usepackage{german} -\usepackage[utf8]{inputenc} - -\begin{document} - -\section*{Titel} - -\subsection*{Abschnitt1} - -Text - -\subsection*{Abschnitt2} - -Text - -\end{document} diff --git a/kernel-devel/driver-basics/pres_driver-basics_de.tex b/kernel-devel/driver-basics/pres_driver-basics_de.tex deleted file mode 100644 index 07db328..0000000 --- a/kernel-devel/driver-basics/pres_driver-basics_de.tex +++ /dev/null @@ -1,24 +0,0 @@ -\documentclass{article} -\usepackage{german} -\usepackage[utf8]{inputenc} - -\begin{document} - -\section*{Block \lq Was ist Linux?\rq} - -\subsection*{Lernziele} -\begin{itemize} -\item Lernziel 1 -\item Lernziel 2 -\item Lernziel 3 -\end{itemize} - -\subsection*{Unterrichts-Ablauf} - -Hinweise zur Präsentation, Zeitplanung, etc. - -\subsection*{Übungen bei vorhandener Hardware} - -Hinweise zu Übungen, Zeitlimit dazu. - -\end{document} diff --git a/kernel-devel/kernel-basics/Makefile b/kernel-devel/kernel-basics/Makefile index 4663d52..d641258 100644 --- a/kernel-devel/kernel-basics/Makefile +++ b/kernel-devel/kernel-basics/Makefile @@ -1,7 +1,7 @@ all: for pdf in `ls -1 *.tex` ; do \ - pdflatex $$pdf; \ - pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ done clean: diff --git a/kernel-devel/kernel-basics/handout_kernel-basics_de.tex b/kernel-devel/kernel-basics/handout_kernel-basics_de.tex index 057f4bc..38d3a08 100644 --- a/kernel-devel/kernel-basics/handout_kernel-basics_de.tex +++ b/kernel-devel/kernel-basics/handout_kernel-basics_de.tex @@ -1,12 +1,6 @@ -\documentclass{lxarticle} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{lxheaders} -\usepackage{lxextras} +\input{confighandout} -\begin{document} - -\section*{Kernel-Grundlagen} +\subsection{Kernel-Grundlagen} Der Linux-Kernel ist moderner Betriebssystemkern, der sich unter anderem durch folgende Eigenschaften auszeichnet: @@ -31,7 +25,7 @@ auch in vielen anderen Bereichen wie dem Cluster-Computing (Google, Rendern von Spielfilm-Effekten in Hollywood) werden die Aufgaben heute fast ausschließlich mit Linux gelöst. -\subsection*{Aufbau des Kernels} +\subsubsection{Aufbau des Kernels} Der Sourcecode des Kernels ist recht übersichtlich in Subsysteme gegliedert. Die Grenzen der einzelnen Subsysteme sind keinesfalls scharf definiert, aber @@ -70,7 +64,7 @@ Treiber-Baums im \cmd{sysfs} kommt automatisch allen Treibern zugute. Diese übergeordneten Treiberfunktionen werden als \emph{Driver Core} bezeichnet. -\subsection*{Kernel Maintainer} +\subsubsection{Kernel Maintainer} Jedes Subsystem wird normalerweise von einem, manchmal auch mehreren Programmierern betreut. Diese Betreuer bezeichnet man als \emph{Maintainer}. @@ -93,7 +87,7 @@ Thema zuständige Mailingliste. Fragen oder Änderungsvorschläge sollte man \emph{immer} an die Mailingliste senden und nicht persönlich an den Maintainer! -\subsection*{Entwicklungsprozess} +\subsubsection{Entwicklungsprozess} Änderungen am Linux-Kernel erfolgen ausschließlich durch \emph{Patche}. Ein Patch ist eine durch das Programm \cmd{diff} Textdatei, die die Änderungen @@ -121,7 +115,7 @@ Informationen dazu findet man in den Kernelquellen unter \cmd{Documentation/SubmittingPatches} -\subsection*{Kernel-Konfiguration} +\subsubsection{Kernel-Konfiguration} Der Kernel ist durch eine Vielzahl an Optionen (mehrere 1000) in weiten Bereichen konfigurierbar. Die Konfiguration wird im Hauptverzeichnis der @@ -139,4 +133,4 @@ Das Kernel-Buildsystem stellt ein eigenes Subsystem dar und hat einen eigenen Maintainer. Es handhabt den kompletten Build-Prozess des Kernels und unterstützt dabei auch explizit Cross-Compiling. -\end{document} +\input{tailhandout} diff --git a/kernel-devel/kernel-basics/pres_kernel-basics_de.tex b/kernel-devel/kernel-basics/pres_kernel-basics_de.tex index 8b6161e..372ada2 100644 --- a/kernel-devel/kernel-basics/pres_kernel-basics_de.tex +++ b/kernel-devel/kernel-basics/pres_kernel-basics_de.tex @@ -1,22 +1,13 @@ -\documentclass{beamer} -\usetheme{linutronix} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{pgf} -\usepackage{graphicx} -\usepackage{lxextras} +\input{configpres} \title{Kernel-Grundlagen} -\institute{Linutronix GmbH} - -\begin{document} - \maketitle +\subsection{Grundlagen} -% ----- Slide ------------------ +\subsubsection{Kernel Eigenschaften} \begin{frame} -\frametitle{Kernel-Eigenschaften} +\frametitle{Kernel Eigenschaften} \begin{itemize} \item Freie Software (GPL Version 2) \pause @@ -42,14 +33,14 @@ \end{itemize} \end{frame} -% ----- Slide ------------------ +\subsubsection{Aufbau} \begin{frame} \frametitle{Aufbau des Kernels} \centering \includegraphics[width=0.8\textwidth]{images/Subsystems.png} \end{frame} -% ----- Slide ------------------ +\subsubsection{Maintainer} \begin{frame} \frametitle{Kernel Maintainer} \begin{itemize} @@ -65,7 +56,7 @@ \end{itemize} \end{frame} -% ----- Slide ------------------ +\subsubsection{Entwicklungsprozess} \begin{frame} \frametitle{Entwicklungsprozess} \begin{itemize} @@ -81,7 +72,7 @@ \end{itemize} \end{frame} -% ----- Slide ------------------ +\subsubsection{Konfiguration} \begin{frame} \frametitle{Kernel-Konfiguration} \begin{itemize} @@ -99,5 +90,4 @@ \end{itemize} \end{frame} - -\end{document} +\input{tailpres} diff --git a/kernel-devel/kernel-best-practices/Makefile b/kernel-devel/kernel-best-practices/Makefile index 4663d52..d641258 100644 --- a/kernel-devel/kernel-best-practices/Makefile +++ b/kernel-devel/kernel-best-practices/Makefile @@ -1,7 +1,7 @@ all: for pdf in `ls -1 *.tex` ; do \ - pdflatex $$pdf; \ - pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ done clean: diff --git a/kernel-devel/kernel-build/Makefile b/kernel-devel/kernel-build/Makefile index 4663d52..d641258 100644 --- a/kernel-devel/kernel-build/Makefile +++ b/kernel-devel/kernel-build/Makefile @@ -1,7 +1,7 @@ all: for pdf in `ls -1 *.tex` ; do \ - pdflatex $$pdf; \ - pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ done clean: diff --git a/kernel-devel/kernel-build/handout_kernel-build_de.tex b/kernel-devel/kernel-build/handout_kernel-build_de.tex index f0e5fae..bd28a31 100644 --- a/kernel-devel/kernel-build/handout_kernel-build_de.tex +++ b/kernel-devel/kernel-build/handout_kernel-build_de.tex @@ -1,14 +1,8 @@ -\documentclass{lxarticle} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{lxheaders} -\usepackage{lxextras} +\input{confighandout} -\begin{document} +\subsection{Kernel konfigurieren und kompilieren} -\section*{Kernel konfigurieren und kompilieren} - -\subsection*{Vorarbeiten} +\subsubsection{Vorarbeiten} Bevor man einen Kernel konfigurieren kann, sollte man wissen, was man will. Das hört sich zunächst nach einer trivialen Binsenweisheit an, kann aber @@ -32,7 +26,7 @@ beispielsweise keine Gerätedateien unterstützt. Will man Linux von einem USB-Stick booten, so wird man diesen dazu beispielsweise mit einem ext2-Dateisystem versehen. - \subsection*{Kernel-Konfiguration} +\subsubsection{Kernel-Konfiguration} Mit diesen Informationen versehen, kann man jetzt die Konfiguration beginnen. Dies erfolgt durch Eingabe von @@ -54,7 +48,7 @@ Man sollte bei der Konfiguration zuerst grundlegende Dinge wie den Prozessortyp angeben, da untergeordnete Eigenschaften oder Treiber davon abhängig sein können. -\subsection*{Module, ja oder nein?} +\subsubsection{Module, ja oder nein?} Bei üblichen Kerneln für Desktop-Systeme wird man immer einen Großteil der Treiber als Module kompilieren. Solche Rechner besitzen viele Schnittstellen, über die man später die Hardware erweitern kann, und kann den Kernel bereits @@ -83,7 +77,7 @@ Einzelfall ab. Bei Embedded Systems kommt dies aber durchaus öfter vor. Aus verständlichen Gründen dürfen Treiber, die zum Booten und Mounten des Rootfs benötigt werden, niemals als Module gebaut werden! -\subsection*{initrd} +\subsubsection{initrd} Die Kernel von Distributionen haben das Problem, dass sie auf möglichst vielen unterschiedlichen Rechnern booten müssen. Würde man die Treiber für alle @@ -100,7 +94,7 @@ aus dem Speicher entfernt werden. Dieses Verfahren nennt man \emph{initrd} Wenn man einen Kernel für ein bestimmtes Board selbst kompiliert, braucht man nie eine initrd, da man ja genau die richtigen Treiber fest einkompilieren kann. -\subsection*{initramfs} +\subsubsection{initramfs} Ein anderes Verfahren, bei dem der Kernel zunächst eine RAM-Disk anlegt, ist \emph{initramfs}. Im Unterschied zu initrd wird diese aber nicht aus einem @@ -125,7 +119,7 @@ Eine weitere Anwendung sind Firmware-Updates. So könnten die Startskripte des initramfs beispielsweise auf einem Server nachschauen, ob Updates vorhanden sind, und diese dann anwenden. -\subsection*{Kernel kompilieren} +\subsubsection{Kernel kompilieren} Nach abgeschlossener Kernel-Konfiguration kompiliert man den Kernel einfach durch Eingabe von @@ -168,7 +162,7 @@ Hauptverzeichnis der Kernelquellen, so ergibt sich folgender Aufruf: ./makearm -j3 \end{lstlisting} -\subsection*{Kernel installieren} +\subsubsection{Kernel installieren} Einen Kernel für den lokalen Rechner (also den, auf dem man auch kompiliert hat) installiert man einfach durch Eingabe von @@ -217,7 +211,7 @@ Root-Filesystem per NFS aus diesem Verzeichnis gemountet, so stehen die Module sofort und ohne Reboot zur Verfügung. Diese Vorgehensweise hat sich bei der Entwicklung von Treibern für Embedded Systems sehr bewährt. -\subsection*{Kontrollfragen} +\subsubsection{Kontrollfragen} \begin{enumerate} \item Beschreiben Sie Unterschiede zwischen initrd und initramfs. @@ -226,5 +220,4 @@ Entwicklung von Treibern für Embedded Systems sehr bewährt. \item Nennen Sie eine Anwendung von initramfs. \end{enumerate} - -\end{document} +\input{tailhandout} diff --git a/kernel-devel/linux-mm-basics/Makefile b/kernel-devel/linux-mm-basics/Makefile index 4663d52..d641258 100644 --- a/kernel-devel/linux-mm-basics/Makefile +++ b/kernel-devel/linux-mm-basics/Makefile @@ -1,7 +1,7 @@ all: for pdf in `ls -1 *.tex` ; do \ - pdflatex $$pdf; \ - pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ done clean: diff --git a/kernel-devel/linux-mm-basics/pres_linux-mm-basics_en.tex b/kernel-devel/linux-mm-basics/pres_linux-mm-basics_en.tex index 8ff0da7..f46c91d 100644 --- a/kernel-devel/linux-mm-basics/pres_linux-mm-basics_en.tex +++ b/kernel-devel/linux-mm-basics/pres_linux-mm-basics_en.tex @@ -1,23 +1,16 @@ -\documentclass{beamer} -\usetheme{linutronix} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{pgf} -\usepackage{graphicx} +\input{configpres} -\title{Linux Memory Management basics} -\institute{Linutronix GmbH} +\title{Linux Memory Management} +\maketitle -\begin{document} +\subsection{Linux Memory Management} -\maketitle \begin{frame} \frametitle{Overview} \tableofcontents \end{frame} -\section{Basics} -\subsection{Overview} +\subsubsection{Basics} \begin{frame} \frametitle{Overview} \begin{itemize} @@ -76,7 +69,7 @@ Possible settings are: \end{itemize} \end{frame} -\subsection{The stack} +\subsubsection{The stack} \begin{frame} \frametitle{The stack} \begin{itemize} @@ -90,8 +83,7 @@ Possible settings are: \end{itemize} \end{frame} -\subsection{The heap} - +\subsubsection{The heap} \begin{frame} \frametitle{The heap: Userland handling} \begin{itemize} @@ -121,8 +113,8 @@ guarantee that the memory really is available. \end{itemize} \end{frame} -\section{Do's and Dont's} -\subsection{The heap} +\subsection{Do's and Dont's} +\subsubsection{The heap} % fragmentation % check return value % ulimit (limit memory consumption) @@ -176,8 +168,8 @@ file locks (-x) unlimited \end{verbatim} \end{frame} -\section{Realtime} -\subsection{General} +\subsection{Realtime} +\subsubsection{General} \begin{frame}[fragile] \frametitle{Locking the memory} \begin{verbatim} @@ -188,7 +180,8 @@ if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) { } \end{verbatim} \end{frame} -\subsection{Stack} + +\subsubsection{Stack} \begin{frame}[fragile] \frametitle{Stack prefaulting} \begin{verbatim} @@ -203,7 +196,7 @@ void stack_prefault(void) { \end{verbatim} \end{frame} -\subsection{Heap} +\subsubsection{Heap} \begin{frame} \frametitle{Allocations from Realtime context} \begin{itemize} @@ -241,7 +234,7 @@ static void reserve_process_memory(int size) \end{verbatim} \end{frame} -\section*{sources} +\subsection*{sources} \begin{frame} \frametitle{sources} \begin{thebibliography}{1} @@ -250,4 +243,4 @@ static void reserve_process_memory(int size) \end{thebibliography} \end{frame} -\end{document} +\input{tailpres} diff --git a/kernel-devel/module-basics/Makefile b/kernel-devel/module-basics/Makefile index 4663d52..d641258 100644 --- a/kernel-devel/module-basics/Makefile +++ b/kernel-devel/module-basics/Makefile @@ -1,7 +1,7 @@ all: for pdf in `ls -1 *.tex` ; do \ - pdflatex $$pdf; \ - pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ done clean: diff --git a/kernel-devel/module-basics/pres_module-basics_de.tex b/kernel-devel/module-basics/pres_module-basics_de.tex index 533a668..2adbf59 100644 --- a/kernel-devel/module-basics/pres_module-basics_de.tex +++ b/kernel-devel/module-basics/pres_module-basics_de.tex @@ -1,20 +1,11 @@ -\documentclass{beamer} -\usetheme{linutronix} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{pgf} -\usepackage{graphicx} -\usepackage{psfrag} -\usepackage{listings} +\input{configpres} \title{Treiber Modul Grundlagen} -\institute{Linutronix GmbH} - -\begin{document} -\lstset{language=[ANSI]C, moredelim=[is][\color{blue}]{|}{|}} \maketitle -% ----- Slide Aufbau ------------------ +\subsection{Kernel Module} + +\subsubsection{Aufbau} \begin{frame}[fragile] \frametitle{Aufbau eines Treiber Moduls} \pause @@ -44,7 +35,6 @@ module_init(vain_init); \end{itemize} \end{frame} -% ----- Slide Aufbau (fort.) ------------------ \begin{frame}[fragile] \frametitle{Aufbau (fort.)} \begin{itemize} @@ -74,7 +64,7 @@ MODULE_VERSION("0815"); \end{itemize} \end{frame} -% ----- Slide Rumpf Treiber ------------------ +\subsubsection{Rumpf Treiber} \begin{frame}[fragile] \frametitle{Rumpf Treiber} \begin{tiny} @@ -82,7 +72,7 @@ MODULE_VERSION("0815"); \end{tiny} \end{frame} -% ----- Slide Makefile ------------------ +\subsubsection{Makefile} \begin{frame}[fragile] \frametitle{Makefile} \begin{scriptsize} @@ -90,7 +80,7 @@ MODULE_VERSION("0815"); \end{scriptsize} \end{frame} -% ----- Slide build ------------------ +\subsubsection{Bauen und Laden} \begin{frame}[fragile] \frametitle{Bauen, laden und entladen des Moduls} \begin{itemize} @@ -132,7 +122,6 @@ vain_exit: done \end{itemize} \end{frame} -% ----- Slide Komplexere Module ------------------ \begin{frame} \frametitle{Komplexere Module} \pause @@ -163,7 +152,7 @@ vain_exit: done \end{itemize} \end{frame} -% ----- Slide PCI Treiber ------------------ +\subsubsection{PCI Treiber Modul} \begin{frame}[fragile] \frametitle{Aufbau eines PCI Treiber Moduls} \pause @@ -199,7 +188,6 @@ module_init(vain_pci_init); \end{itemize} \end{frame} -% ----- Slide PCI Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines PCI Treiber Moduls (fort.)} \begin{itemize} @@ -219,7 +207,6 @@ module_exit(vain_pci_exit); \end{itemize} \end{frame} -% ----- Slide PCI Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines PCI Treiber Moduls (fort.)} \begin{itemize} @@ -238,7 +225,6 @@ module_exit(vain_pci_exit); \end{itemize} \end{frame} -% ----- Slide PCI Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines PCI Treiber Moduls (fort.)} \begin{itemize} @@ -256,7 +242,6 @@ module_exit(vain_pci_exit); \end{itemize} \end{frame} -% ----- Slide PCI Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines PCI Treiber Moduls (fort.)} \begin{itemize} @@ -290,7 +275,6 @@ module_exit(vain_pci_exit); \end{itemize} \end{frame} -% ----- Slide PCI Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines PCI Treiber Moduls (fort.)} \begin{itemize} @@ -314,13 +298,11 @@ module_exit(vain_pci_exit); \end{itemize} \end{frame} -% ----- Slide PCI Treiber Hintergrund ------------------ \begin{frame} \frametitle{PCI Treiber Hintergrund} \includegraphics[width=7cm]{images/PCI_driver.png} \end{frame} -% ----- Slide PCI Rumpf Treiber ------------------ \begin{frame}[fragile] \frametitle{PCI Rumpf Treiber} \begin{tiny} @@ -328,7 +310,6 @@ module_exit(vain_pci_exit); \end{tiny} \end{frame} -% ----- Slide PCI Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{PCI Rumpf Treiber (fort.)} \begin{tiny} @@ -336,7 +317,6 @@ module_exit(vain_pci_exit); \end{tiny} \end{frame} -% ----- Slide PCI Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{PCI Rumpf Treiber (fort.)} \begin{tiny} @@ -344,7 +324,6 @@ module_exit(vain_pci_exit); \end{tiny} \end{frame} -% ----- Slide PCI Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{PCI Rumpf Treiber (fort.)} \begin{tiny} @@ -352,7 +331,6 @@ module_exit(vain_pci_exit); \end{tiny} \end{frame} -% ----- Slide PCI Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{PCI Rumpf Treiber (fort.)} \begin{tiny} @@ -360,7 +338,6 @@ module_exit(vain_pci_exit); \end{tiny} \end{frame} -% ----- Slide PCI Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{PCI Rumpf Treiber (fort.)} \begin{tiny} @@ -368,7 +345,7 @@ module_exit(vain_pci_exit); \end{tiny} \end{frame} -% ----- Slide Platform Treiber ------------------ +\subsubsection{Platform Treiber Modul} \begin{frame}[fragile] \frametitle{Aufbau eines Platform Treiber Moduls} \pause @@ -404,7 +381,6 @@ static int __init vain_plat_init(void) \end{itemize} \end{frame} -% ----- Slide Platform Treiber ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines Platform Treiber Moduls (fort.)} \pause @@ -423,7 +399,6 @@ static void __exit vain_plat_exit(void) \end{itemize} \end{frame} -% ----- Slide Platform Treiber ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines Platform Treiber Moduls (fort.)} \pause @@ -445,7 +420,6 @@ static void __exit vain_plat_exit(void) \end{itemize} \end{frame} -% ----- Slide Platform Treiber ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines Platform Treiber Moduls (fort.)} \pause @@ -479,7 +453,6 @@ static void __exit vain_plat_exit(void) \end{itemize} \end{frame} -% ----- Slide Platform Treiber ------------------ \begin{frame}[fragile] \frametitle{Aufbau eines Platform Treiber Moduls (fort.)} \pause @@ -507,13 +480,11 @@ static void __exit vain_plat_exit(void) \end{itemize} \end{frame} -% ----- Slide PCI Treiber Hintergrund ------------------ \begin{frame} \frametitle{Platform Treiber Hintergrund} \includegraphics[width=7cm]{images/plat_driver.png} \end{frame} -% ----- Slide Platform Rumpf Treiber ------------------ \begin{frame}[fragile] \frametitle{Platform Rumpf Treiber} \begin{tiny} @@ -521,7 +492,6 @@ static void __exit vain_plat_exit(void) \end{tiny} \end{frame} -% ----- Slide Platform Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Platform Rumpf Treiber (fort.)} \begin{tiny} @@ -529,7 +499,6 @@ static void __exit vain_plat_exit(void) \end{tiny} \end{frame} -% ----- Slide Platform Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Platform Rumpf Treiber (fort.)} \begin{tiny} @@ -537,7 +506,6 @@ static void __exit vain_plat_exit(void) \end{tiny} \end{frame} -% ----- Slide Platform Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Platform Rumpf Treiber (fort.)} \begin{tiny} @@ -545,7 +513,6 @@ static void __exit vain_plat_exit(void) \end{tiny} \end{frame} -% ----- Slide Platform Rumpf Treiber (fort.) ------------------ \begin{frame}[fragile] \frametitle{Platform Rumpf Treiber (fort.)} \begin{tiny} @@ -553,4 +520,4 @@ static void __exit vain_plat_exit(void) \end{tiny} \end{frame} -\end{document} +\input{tailpres} diff --git a/kernel-devel/section.tex b/kernel-devel/section.tex new file mode 100644 index 0000000..4b78c2f --- /dev/null +++ b/kernel-devel/section.tex @@ -0,0 +1 @@ +\section{Kernelprogrammierung} diff --git a/kernel-devel/uio-driver/Makefile b/kernel-devel/uio-driver/Makefile index 4663d52..d641258 100644 --- a/kernel-devel/uio-driver/Makefile +++ b/kernel-devel/uio-driver/Makefile @@ -1,7 +1,7 @@ all: for pdf in `ls -1 *.tex` ; do \ - pdflatex $$pdf; \ - pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ + TEXINPUTS=`pwd`/../..:.:..:$(TEXINPUTS) pdflatex $$pdf; \ done clean: diff --git a/kernel-devel/uio-driver/handout_uio-driver_de.tex b/kernel-devel/uio-driver/handout_uio-driver_de.tex index 546c7fe..f25b538 100644 --- a/kernel-devel/uio-driver/handout_uio-driver_de.tex +++ b/kernel-devel/uio-driver/handout_uio-driver_de.tex @@ -1,12 +1,6 @@ -\documentclass{lxarticle} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{lxheaders} -\usepackage{lxextras} +\input{confighandout} -\begin{document} - -\section*{Linux-Treiber im Userspace} +\subsection{Linux-Treiber im Userspace} Das ab Linux 2.6.23 im stabilen Kernel verfügbare Userspace-I/O-Framework (UIO) ermöglicht, bestimmte Treiber fast vollständig in den Userspace zu @@ -64,7 +58,7 @@ einkompiliert wird, muss dieser Lizenz genügen, das heißt, der Sourcecode muss (meist illegale) Tricks angewandt, um dieser Bedingung der GPL zu entgehen und ihren Kernelcode unter Verschluss zu halten. -\subsection*{UIO löst Probleme} +\subsubsection{UIO löst Probleme} Die geschilderte Problematik führte bereits vor längerer Zeit zu Überlegungen, zumindest Teile eines Treibers in den Userspace zu verlagern. I/O-Hardware @@ -118,7 +112,7 @@ Eintreffen des nächsten Interrupts nicht fertig wird, so ist das zumindest softwaretechnisch kein Problem: Anhand des gelesenen Werts beim nächsten \cmd{read()} erkennen Sie, wie viele Interrupts Sie verpasst haben. -\subsection*{GPL oder nicht GPL} +\subsubsection{GPL oder nicht GPL} Der Linux-Kernel einschließlich aller enthaltenen Module ist unter der GPL lizensiert. Programme im Linux-Userspace unterliegen solchen Einschränkungen @@ -151,7 +145,7 @@ zu verhindern, bewusst gegen die GPL zu verstoßen oder ganz auf Linux zu verzichten. Durch UIO wird an dieser Stelle ein gangbarer und legaler Ausweg geschaffen. -\subsection*{Konventionelle Treiber...} +\subsubsection{Konventionelle Treiber...} Bisherige Gerätetreiber sind vollständig im Kernel integriert. Die Schnittstelle zum Userspace besteht typischerweise aus einer Gerätedatei, auf @@ -225,7 +219,7 @@ Aufnahme in den offiziellen Mainline-Kernel haben. Dadurch haben die Programmierer dann während der gesamten Laufzeit des Produkts zusätzlich das Problem, diesen wackligen Treiber out-of-tree warten zu müssen. -\subsection*{...und UIO-Treiber} +\subsubsection{...und UIO-Treiber} Sieht man sich Gerätetreiber etwas genauer an, so stellt man fest, dass es stets wiederkehrende Aufgabenstellungen gibt. Zum einen hat die Hardware @@ -301,7 +295,7 @@ in der Regel root-Rechte des Anwenders erfordert und bei Fehlern zu einem völlig unbrauchbaren System führt. Bei einem UIO-Treiber unterscheidet sich ein Update des Treibers durch nichts von einem Update der Anwender-Applikation. -\subsection*{Wartungsvertrag} +\subsubsection{Wartungsvertrag} Ein Treiber will gewartet sein. Bei industriellen Geräten findet man oft die Situation, dass ein Gerät über einen längeren Zeitraum mit der selben @@ -341,7 +335,7 @@ Linux-Kernel-Mailingliste um die Aufnahme desselben zu bitten. Die Mühe lohnt sich: Zukünftige Kernel haben die Unterstützung für ihr Produkt schon eingebaut, Versionskonflikte oder das mühsame Kernel-Patchen entfällt. -\subsection*{Los geht's...} +\subsubsection{Los geht's...} Wie sieht nun ein UIO-Treiber konkret aus? Betrachten wir dazu einen Treiber für eine PCI-Karte. Die folgenden Beispiele sind Auszüge aus dem bereits @@ -463,7 +457,7 @@ Ausführliche Dokumentation findet sich auch in den Kernel-Quellen in \cmd{Documentation/DocBook/uio-howto.tmpl}; mit \cmd{make htmldocs} erstellt man daraus eine lesbare Form. -\subsection*{Testen mit lsuio} +\subsubsection{Testen mit lsuio} Hat man einen UIO-Kerneltreiber geladen, so führt der erste Weg ins Verzeichnis \cmd{/sys/class/uio/uio0}, wo man überprüft, ob alle Dateien die erwarteten @@ -492,7 +486,7 @@ Durch Überprüfen der Dateien \cmd{name} und \cmd{version} in den Verzeichnisse unterhalb von \cmd{/sys/class/uio} kann man diese Informationen auf sichere Weise gewinnen. -\subsection*{Weiter geht's im Userspace} +\subsubsection{Weiter geht's im Userspace} Der Userspace-Teil des Treibers wird zunächst über das sysfs den Namen des zuständigen Device-Files ermitteln. Im Folgenden wird der Einfachkeit halber @@ -549,7 +543,7 @@ steht Experimenten kaum etwas im Weg. Sie können jedenfalls keine schlimmeren Abstürze verursachen als beim Programmieren jeder anderen Anwender-Applikation. -\subsection*{UIO oder nicht UIO} +\subsubsection{UIO oder nicht UIO} Sollen jetzt in Zukunft alle Treiber mittels UIO realisiert werden? Sicher nicht. UIO eignet sich sehr gut für Hardware, die Interrupts erzeugt, deren @@ -578,7 +572,7 @@ weite Verbreitung von X.org bereits ein anderer Standard etabliert, der im beispielsweise schnelle A/D-Wandler, könnten DMA benötigen. Die Zukunft wird zeigen, ob an dieser Stelle Nachfrage besteht. -\subsection*{Fazit} +\subsubsection{Fazit} Durch das seit Kernel-Version 2.6.23 in Linux verfügbare Userspace I/O-Framework wird es besonders für Industriebetriebe erheblich @@ -599,4 +593,4 @@ Realtime-Preemption-Patch einspielt, so erhält man ein einfach zu programmierendes und vollständig aus Open Source-Software bestehendes System für die Automatisierungstechnik. -\end{document} +\input{tailhandout} diff --git a/kernel-devel/uio-driver/pres_uio-driver_en.tex b/kernel-devel/uio-driver/pres_uio-driver_en.tex index ca9ff44..b16045f 100644 --- a/kernel-devel/uio-driver/pres_uio-driver_en.tex +++ b/kernel-devel/uio-driver/pres_uio-driver_en.tex @@ -1,23 +1,15 @@ -\documentclass{beamer} -\usetheme{linutronix} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{pgf} -\usepackage{graphicx} +\input{configpres} \title{The Userspace I/O Framework (UIO)} -\institute{Linutronix GmbH} - -\begin{document} - \maketitle -% ----- Slide "Desperate programmer" ------------------ +\subsection{The Userspace I/O Framework (UIO)} + \begin{frame} \includegraphics[width=11cm]{images/hjk-desperate.jpg} \end{frame} -% ----- Slide "Linux device drivers" ------------------ +\subsubsection{Linux device drivers} \begin{frame} \frametitle{Linux device drivers} \pause @@ -28,7 +20,6 @@ \end{itemize} \end{frame} -% ----- Slide "Standard devices" ----------------------- \begin{frame} \frametitle{Standard devices} \pause @@ -46,7 +37,6 @@ \end{itemize} \end{frame} -% ----- Slide "Problematic devices" ------------------- \begin{frame} \frametitle{Problematic devices} \pause @@ -66,17 +56,15 @@ \end{itemize} \end{frame} -% ----- Slide "In-kernel driver" ------------------ \begin{frame} \includegraphics[width=11cm]{images/konventioneller-treiber_en.png} \end{frame} -% ----- Slide "UIO driver" ------------------ \begin{frame} \includegraphics[width=11cm]{images/uio-treiber_en.png} \end{frame} -% ----- Slide "How UIO works" -------------------------- +\subsubsection{Structure} \begin{frame} \frametitle{How UIO works} \pause @@ -96,7 +84,6 @@ \end{itemize} \end{frame} -% ----- Slide "Kernel: interrupt handler" -------------------------- \begin{frame}[fragile] \frametitle{Kernel: interrupt handler} \begin{verbatim} @@ -113,7 +100,6 @@ irqreturn_t my_handler(int irq, struct uio_info *dev_info) \end{verbatim} \end{frame} -% ----- Slide "Kernel: probe() function" -------------------------- \begin{frame}[fragile] \frametitle{Kernel: probe() function} \begin{verbatim} @@ -128,7 +114,6 @@ int pci_probe(struct pci_dev *dev, \end{verbatim} \end{frame} -% ----- Slide "Kernel: struct uio_info" -------------------------- \begin{frame}[fragile] \frametitle{Kernel: struct uio\_info} \begin{verbatim} @@ -148,7 +133,6 @@ struct uio_info { \end{verbatim} \end{frame} -% ----- Slide "Kernel: struct uio_mem" -------------------------- \begin{frame}[fragile] \frametitle{Kernel: struct uio\_mem} \begin{verbatim} @@ -162,7 +146,7 @@ struct uio_mem { \end{verbatim} \end{frame} -% ----- Slide "Userspace part of driver" -------------- +\subsubsection{Userspace} \begin{frame} \frametitle{Userspace: Overview} \pause @@ -181,7 +165,6 @@ struct uio_mem { \end{itemize} \end{frame} -% ----- Slide "Hello UIO world" -------------- \begin{frame}[fragile] \frametitle{Hello UIO world} \pause @@ -196,7 +179,7 @@ while (read(fd, &irq_cnt, 4)) { \end{verbatim} \end{frame} -% ----- Slide "Performance considerations" -------------- +\subsubsection{Performance} \begin{frame} \frametitle{Performance considerations} \pause @@ -207,12 +190,11 @@ while (read(fd, &irq_cnt, 4)) { \end{itemize} \end{frame} -% ----- Slide "ioctl vs. UIO" ------------------ \begin{frame} \includegraphics[width=10cm]{images/ioctl-vs-uio_en.png} \end{frame} -% ----- Slide "Publish your driver!" -------------- +\subsubsection{Publish your driver} \begin{frame} \frametitle{Publish your driver!} \pause @@ -241,7 +223,7 @@ while (read(fd, &irq_cnt, 4)) { \includegraphics[width=11cm]{images/greg-kernel-org.jpg} \end{frame} -% ----- Slide "Legal issues" -------------------------- +\subsubsection{Legal issues} \begin{frame} \frametitle{Legal issues} \pause @@ -254,7 +236,7 @@ while (read(fd, &irq_cnt, 4)) { \end{itemize} \end{frame} -% ----- Slide "Tools" -------------------------- +\subsubsection{Tools} \begin{frame} \frametitle{Tools} \pause @@ -265,7 +247,6 @@ while (read(fd, &irq_cnt, 4)) { \end{itemize} \end{frame} -% ----- Slide "OSADL" -------------------------- \begin{frame} \frametitle{OSADL} \pause @@ -278,7 +259,7 @@ while (read(fd, &irq_cnt, 4)) { \end{itemize} \end{frame} -% ----- Slide "Future" -------------------------- +\subsubsection{Future Development} \begin{frame} \frametitle{Future} \pause @@ -289,13 +270,4 @@ while (read(fd, &irq_cnt, 4)) { \end{itemize} \end{frame} -% ----- Slide "Thanks for listening!" ---------- -\begin{frame} -\frametitle{Thanks for listening!} -\pause -\begin{itemize} -\item Questions ? -\end{itemize} -\end{frame} - -\end{document} +\input{tailpres} diff --git a/pres_master.tex b/pres_master.tex index 3053985..b0fff19 100644 --- a/pres_master.tex +++ b/pres_master.tex @@ -13,4 +13,10 @@ \input{./flash-memory/ubi/pres_ubi_de.tex} \input{./frameworks/section} \input{./frameworks/middleware/pres_middleware.tex} +\input{./kernel-devel/section.tex} +\input{./kernel-devel/char-device/pres_char-device_de.tex} +\input{./kernel-devel/kernel-basics/pres_kernel-basics_de.tex} +\input{./kernel-devel/linux-mm-basics/pres_linux-mm-basics_en.tex} +\input{./kernel-devel/module-basics/pres_module-basics_de.tex} +\input{./kernel-devel/uio-driver/pres_uio-driver_en.tex} \input{tailmasterpres} |
