summaryrefslogtreecommitdiff
path: root/kernel-devel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel-devel')
-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
4 files changed, 0 insertions, 812 deletions
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}