summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Traut <manut@linutronix.de>2010-12-01 12:08:10 +0100
committerManuel Traut <manut@linutronix.de>2010-12-01 12:08:10 +0100
commitff17613cf37db72955edd0b6bfaeecf573791736 (patch)
tree2a1bb0a67720215d6dc08ff52c183c30e9754af2
parent9634fb0c75c4c3f227772ec9ddf22f992f35013c (diff)
parent4cfb9eb272daf14b7975018df0aa9332971f8d5f (diff)
Merge branch 'continental' of tglx.de:/home/jan/git/schulung into jan
-rw-r--r--application-devel/cross-devel/pres_cross-devel-ppc-qemu_de.tex387
-rw-r--r--application-devel/cross-devel/pres_cross-devel_de.tex252
-rw-r--r--application-devel/devel-scenarios/Makefile9
-rw-r--r--application-devel/devel-scenarios/images/cygwin.diabin0 -> 1304 bytes
-rw-r--r--application-devel/devel-scenarios/images/cygwin.pngbin0 -> 19295 bytes
-rw-r--r--application-devel/devel-scenarios/images/linux_server.diabin0 -> 1621 bytes
-rw-r--r--application-devel/devel-scenarios/images/linux_server.pngbin0 -> 29417 bytes
-rw-r--r--application-devel/devel-scenarios/images/vmware.diabin0 -> 1256 bytes
-rw-r--r--application-devel/devel-scenarios/images/vmware.pngbin0 -> 19594 bytes
-rw-r--r--application-devel/devel-scenarios/pres_devel_scenarios_de.tex133
-rw-r--r--application-devel/posix-ipc/Makefile9
-rw-r--r--application-devel/posix-ipc/pres_posix_ipc_de.tex414
-rw-r--r--protocols/socketcan/Makefile9
-rw-r--r--protocols/socketcan/pres_socketcan_de.tex206
14 files changed, 1322 insertions, 97 deletions
diff --git a/application-devel/cross-devel/pres_cross-devel-ppc-qemu_de.tex b/application-devel/cross-devel/pres_cross-devel-ppc-qemu_de.tex
new file mode 100644
index 0000000..b4822c6
--- /dev/null
+++ b/application-devel/cross-devel/pres_cross-devel-ppc-qemu_de.tex
@@ -0,0 +1,387 @@
+\documentclass{beamer}
+\usetheme{linutronix}
+\usepackage{german}
+\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+\usepackage{lxextras}
+
+
+\title{Block \lq Cross Development\rq}
+\institute{Linutronix GmbH}
+
+\lstset{keywordstyle=\color{blue},commentstyle=\color{orange}}
+
+\begin{document}
+
+\maketitle
+
+\begin{frame}
+\frametitle{Übersicht}
+\tableofcontents
+\end{frame}
+
+\section{Cross Übersetzen}
+\begin{frame}[containsverbatim]
+\frametitle{Cross ''Hello world''}
+\begin{lstlisting}[language=c]
+/* cross_hello.c */
+#include <stdio.h>
+
+int main(void)
+{
+ printf("Hello cross compiling world\n");
+ return 0;
+}
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Übersetzen für das Zielsystem}
+\begin{lstlisting}[language=bash]
+# Uebersetzen
+powerpc-linux-gnu-gcc -static -o cross_hello \
+cross_hello.c
+\end{lstlisting}
+\begin{lstlisting}[language=bash]
+# Executable ueberpruefen
+$ file cross_hello
+cross_hello: ELF 32-bit MSB executable, PowerPC
+or cisco 4500, version 1 (SYSV),
+dynamically linked (uses shared libs),
+for GNU/Linux 2.6.10, with unknown
+[...]
+not stripped
+\end{lstlisting}
+\end{frame}
+
+\section{Testing auf dem Host}
+
+\begin{frame}
+\frametitle{Qemu als Werkzeug zur Cross Entwicklung}
+\begin{alertblock}{Was ist Qemu?}
+Qemu ist eine sehr performante Emulations- und Virtualisierungsumgebung für alle
+gängigen CPU Architekturen.
+\end{alertblock}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Testen eines Executables mit der Qemu user emulation}
+\begin{lstlisting}[language=bash]
+$ ./cross_hello
+bash: ./cross_hello: cannot execute binary file
+$ qemu-ppc ./cross_hello
+Hello cross compiling world
+\end{lstlisting}
+\end{frame}
+
+\section{Rootfilesystem}
+\subsection{Filesystem from scratch}
+\begin{frame}
+\frametitle{Komponenten des Zielsystems}
+\begin{overprint}
+\onslide <1>
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/target.png}
+\end{figure}
+\onslide <2>
+\begin{figure}[h]
+\centering
+\includegraphics[width=6cm]{images/target_highlight_rfs.png}
+\end{figure}
+\end{overprint}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
+1) Busybox
+\begin{lstlisting}[language=bash]
+mkdir -p /tftpboot/nfsroot
+cd busybox-1.16.1
+make menuconfig
+make CROSS_COMPILE=powerpc-linux-gnu- install
+rsync -Hav _install/ /tftpboot/nfsroot
+cd /tftpboot/nfsroot
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}
+\frametitle{Device nodes}
+\begin{figure}[h]
+\centering
+\includegraphics[width=8cm]{images/mknod.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
+2) Grundstruktur erstellen:
+\begin{lstlisting}[language=bash]
+# Verzeichnisstruktur
+mkdir lib etc tmp dev mnt sys proc
+
+# Devices nodes (als root!)
+mknod dev/console c 5 1
+mknod dev/null c 1 3
+mknod dev/ttyS0 c 4 64
+mknod dev/tty0 c 4 0
+mknod dev/tty1 c 4 1
+mknod dev/tty2 c 4 2
+mknod dev/tty3 c 4 3
+mknod dev/tty4 c 4 4
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
+3) Startscript(e) erstellen
+\begin{lstlisting}[language=bash]
+cd /tftpboot/nfsroot
+mkdir etc/init.d
+vim etc/init.d/rcS
+\end{lstlisting}
+/etc/rc.d/rcS:
+\begin{verbatim}
+#!/bin/sh
+mount -t proc proc /proc
+mount -t sysfs sysfs /sys
+
+mount -o remount,rw /
+\end{verbatim}
+\begin{lstlisting}[language=bash]
+chmod u+x etc/rc.d/rcS
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
+4) Libraries kopieren
+\begin{lstlisting}[language=bash]
+# Loader
+$ cp /path_to_my_libc/lib/ld.so.1 \
+/tftpboot/nfsroot/lib
+# Getting the dependencies and copy them
+$ powerpc-linux-gnu-objdump -x \
+/tftpboot/nfsroot/bin/busybox | grep NEEDED
+ NEEDED libm.so.6
+ NEEDED libc.so.6
+$ cp /path_to_my_libc/lib/libm.so.6 \
+/tftpboot/nfsroot/lib
+$ cp /path_to_my_libc/lib/libc.so.6 \
+/tftpboot/nfsroot/lib
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
+5) Berechtigungen korrigieren:
+\begin{lstlisting}[language=bash]
+chown -R root:root /tftpboot/nfsroot
+\end{lstlisting}
+That's it!! :)
+\end{frame}
+
+\subsection{Exportieren per NFS}
+\subsubsection{Konfiguration}
+\begin{frame}[containsverbatim]
+\frametitle{Exportieren per NFS}
+1) nfs-kernel-server installieren
+\begin{lstlisting}
+# Auf Debian basierten Systemen (als root)
+apt-get install nfs-kernel-server
+\end{lstlisting}
+\end{frame}
+\begin{frame}[containsverbatim]
+\frametitle{Exportieren per NFS}
+2) Directory exportieren
+\begin{lstlisting}[language=bash]
+vim /etc/exports
+\end{lstlisting}
+\begin{verbatim}
+/tftpboot/nfsroot \
+192.168.0.0/255.255.255.0\
+(rw,no_root_squash,no_subtree_check,insecure) \
+127.0.0.1\
+(rw,no_root_squash,no_subtree_check,insecure) \
+10.0.2.0/255.255.255.0\
+(rw,no_root_squash,no_subtree_check,insecure)
+\end{verbatim}
+\begin{lstlisting}[language=bash]
+/etc/init.d/nfs-kernel-server restart
+\end{lstlisting}
+\end{frame}
+\subsubsection{Filesystem mit Qemu testen}
+\begin{frame}[containsverbatim]
+\frametitle{RFS mit Qemu booten}
+\begin{lstlisting}
+qemu-system-ppc -nographic \
+-kernel images/vmlinux \
+-append \
+"console=ttyS0 ip=dhcp \
+root=/dev/nfs \
+nfsroot=10.0.2.2:/tftpboot/nfsroot" \
+-net nic -net user
+\end{lstlisting}
+\end{frame}
+\begin{frame}[containsverbatim]
+\frametitle{RFS mit Qemu booten}
+\begin{verbatim}
+[...]
+IP-Config: Got DHCP answer from 10.0.2.2, my address
+IP-Config: Complete:
+ device=eth0, addr=10.0.2.15, mask=255.255.255.0
+ host=10.0.2.15, domain=, nis-domain=(none),
+ bootserver=10.0.2.2, rootserver=10.0.2.2, rootpath=
+Looking up port of RPC 100003/2 on 10.0.2.2
+Looking up port of RPC 100005/1 on 10.0.2.2
+VFS: Mounted root (nfs filesystem) readonly.
+Freeing unused kernel memory: 208k init
+
+Please press Enter to activate this console.
+\end{verbatim}
+\end{frame}
+
+\begin{frame}
+\frametitle{Congrats!!!}
+Ihr erstes eigenes Linux System!! :)
+\end{frame}
+
+\subsection{RFS um SSH erweitern}
+\begin{frame}
+\frametitle{dropbear}
+Dropbear ist eine schlanke SSH Server und Client Implementierung
+und wird daher recht häufig in Embedded Systemen verwendet.
+\begin{alertblock}{Vorteile}
+\begin{itemize}
+\item Einfach zu übersetzen
+\item Schlank / Wenig Footprint
+\item Einfach Konfiguration
+\end{itemize}
+\end{alertblock}
+\begin{alertblock}{Nachteile}
+\begin{itemize}
+\item Keine eigene SFTP Implementierung
+\end{itemize}
+\end{alertblock}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Dropbear übersetzen}
+\begin{lstlisting}[language=bash]
+$ ./configure --host=powerpc-linux-gnu \
+ --disable-zlib --prefix=/usr
+make
+# Als root
+make DESTDIR=/tftpboot/nfsroot install
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Dropbear: Benötigte Bibliotheken}
+\begin{lstlisting}[language=bash]
+# Schritt 1: libnss
+cp /path_to_my_libc/lib/libnss_* lib/
+# Schritt 2: It's your turn!
+\end{lstlisting}
+Aufgabe: Ermitteln der benötigten Bibliotheken von Dropbear
+und kopieren an die richtige Stelle im RFS.
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Dropbear: Benötigte Bibliotheken / Lösung}
+\begin{lstlisting}[language=bash]
+$ powerpc-linux-gnu-objdump -x \
+/tftpboot/nfsroot/usr/sbin/dropbear | grep NEEDED
+ NEEDED libutil.so.1
+ NEEDED libcrypt.so.1
+ NEEDED libc.so.
+$ cp /path_to_my_libc/libcrypt.so.1 \
+ /tftpboot/nfsroot/lib
+$ cp /path_to_my_libc/libutil.so.1 \
+ /tftpboot/nfsroot/lib
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{RFS um SSH erweitern}
+Vorbereitungen:
+\begin{lstlisting}[language=bash]
+cd /tftpboot/nfsroot
+mknod dev/urandom c 1 9
+mknod dev/ptmx c 5 2
+mkdir root
+echo "root:x:0:0::/root:/bin/sh" >> etc/passwd
+echo "root:x:0:" >> etc/group
+mkdir dev/pts
+mkdir etc/dropbear
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Password für root setzen}
+\begin{lstlisting}[language=bash]
+qemu-system-ppc -nographic \
+-kernel images/vmlinux \
+-append "console=ttyS0 ip=dhcp root=/dev/nfs \
+nfsroot=10.0.2.2:/tftpboot/nfsroot" \
+-net nic -net user,hostfwd=tcp::12345-:22
+\end{lstlisting}
+\begin{lstlisting}[language=bash]
+# Im gebooteten System:
+passwd
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{Dropbear: Startskript erweitern}
+\begin{lstlisting}[language=bash]
+vim /tftpboot/nfsroot/etc/init.d/rcS
+\end{lstlisting}
+\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{7}{7}\selectfont]
+[...]
+
+mount devpts /dev/pts -t devpts
+
+if [ ! -f /etc/dropbear/dropbear_rsa_host_key ]
+then
+ dropbearkey -type rsa -f /etc/dropbear/dropbear_rsa_host_key
+fi
+
+if [ ! -f /etc/dropbear/dropbear_dss_host_key ]
+then
+ dropbearkey -type dss -f /etc/dropbear/dropbear_dss_host_key
+fi
+
+/usr/sbin/dropbear
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[containsverbatim]
+\frametitle{SSH testen}
+\begin{enumerate}
+\item Qemu session starten:
+\begin{lstlisting}[language=bash]
+qemu-system-ppc -nographic \
+-kernel images/vmlinux \
+-append "console=ttyS0 ip=dhcp root=/dev/nfs \
+nfsroot=10.0.2.2:/tftpboot/nfsroot" \
+-net nic -net user,hostfwd=tcp::12345-:22
+\end{lstlisting}
+\item Vom Host-System:
+\begin{lstlisting}[language=bash]
+ssh -p 12345 root@localhost
+\end{lstlisting}
+\begin{verbatim}
+root@localhost's password:
+#
+\end{verbatim}
+\end{enumerate}
+\end{frame}
+
+\subsection{Filesystem auf dem Target testen}
+\begin{frame}
+\frametitle{Auf dem Target}
+HAND'S ON! :)
+\end{frame}
+\end{document}
diff --git a/application-devel/cross-devel/pres_cross-devel_de.tex b/application-devel/cross-devel/pres_cross-devel_de.tex
index b4822c6..c68f7b0 100644
--- a/application-devel/cross-devel/pres_cross-devel_de.tex
+++ b/application-devel/cross-devel/pres_cross-devel_de.tex
@@ -7,7 +7,7 @@
\usepackage{lxextras}
-\title{Block \lq Cross Development\rq}
+\title{\lq Workshop: Cross Development\rq}
\institute{Linutronix GmbH}
\lstset{keywordstyle=\color{blue},commentstyle=\color{orange}}
@@ -30,8 +30,8 @@
int main(void)
{
- printf("Hello cross compiling world\n");
- return 0;
+ printf("Hello cross compiling world\n");
+ return 0;
}
\end{lstlisting}
\end{frame}
@@ -40,18 +40,16 @@ int main(void)
\frametitle{Übersetzen für das Zielsystem}
\begin{lstlisting}[language=bash]
# Uebersetzen
-powerpc-linux-gnu-gcc -static -o cross_hello \
-cross_hello.c
+$ arm-none-linux-gnueabi-gcc -static \
+-o cross_hello cross_hello.c
\end{lstlisting}
\begin{lstlisting}[language=bash]
# Executable ueberpruefen
$ file cross_hello
-cross_hello: ELF 32-bit MSB executable, PowerPC
-or cisco 4500, version 1 (SYSV),
-dynamically linked (uses shared libs),
-for GNU/Linux 2.6.10, with unknown
-[...]
-not stripped
+cross_hello: ELF 32-bit LSB executable, ARM,
+version 1 (SYSV), dynamically
+linked (uses shared libs),
+for GNU/Linux 2.6.14, not stripped
\end{lstlisting}
\end{frame}
@@ -69,8 +67,8 @@ gängigen CPU Architekturen.
\frametitle{Testen eines Executables mit der Qemu user emulation}
\begin{lstlisting}[language=bash]
$ ./cross_hello
-bash: ./cross_hello: cannot execute binary file
-$ qemu-ppc ./cross_hello
+ : ./cross_hello: cannot execute binary file
+$ qemu-arm ./cross_hello
Hello cross compiling world
\end{lstlisting}
\end{frame}
@@ -97,11 +95,12 @@ Hello cross compiling world
\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
1) Busybox
\begin{lstlisting}[language=bash]
-mkdir -p /tftpboot/nfsroot
-cd busybox-1.16.1
+sudo mkdir -p /tftpboot/nfsroot
+cd busybox-1.17.3
make menuconfig
-make CROSS_COMPILE=powerpc-linux-gnu- install
-rsync -Hav _install/ /tftpboot/nfsroot
+make CROSS_COMPILE=arm-none-linux-gnueabi- \
+ install
+sudo rsync -Hav _install/ /tftpboot/nfsroot
cd /tftpboot/nfsroot
\end{lstlisting}
\end{frame}
@@ -116,20 +115,21 @@ cd /tftpboot/nfsroot
\begin{frame}[containsverbatim]
\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
-2) Grundstruktur erstellen:
\begin{lstlisting}[language=bash]
# Verzeichnisstruktur
-mkdir lib etc tmp dev mnt sys proc
-
+mkdir lib etc tmp dev mnt sys proc root
# Devices nodes (als root!)
-mknod dev/console c 5 1
-mknod dev/null c 1 3
-mknod dev/ttyS0 c 4 64
-mknod dev/tty0 c 4 0
-mknod dev/tty1 c 4 1
-mknod dev/tty2 c 4 2
-mknod dev/tty3 c 4 3
-mknod dev/tty4 c 4 4
+sudo mknod dev/console c 5 1
+sudo mknod dev/null c 1 3
+sudo mknod dev/ttyS0 c 4 64
+sudo mknod dev/ttyS1 c 4 65
+sudo mknod dev/ttyS2 c 4 66
+sudo mknod dev/tty c 5 0
+sudo mknod dev/tty0 c 4 0
+sudo mknod dev/tty1 c 4 1
+sudo mknod dev/tty2 c 4 2
+sudo mknod dev/tty3 c 4 3
+sudo mknod dev/tty4 c 4 4
\end{lstlisting}
\end{frame}
@@ -137,11 +137,11 @@ mknod dev/tty4 c 4 4
\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
3) Startscript(e) erstellen
\begin{lstlisting}[language=bash]
-cd /tftpboot/nfsroot
-mkdir etc/init.d
-vim etc/init.d/rcS
+sudo cd /tftpboot/nfsroot
+sudo mkdir etc/init.d
+sudo vim etc/init.d/rcS
\end{lstlisting}
-/etc/rc.d/rcS:
+/etc/init.d/rcS:
\begin{verbatim}
#!/bin/sh
mount -t proc proc /proc
@@ -150,34 +150,33 @@ mount -t sysfs sysfs /sys
mount -o remount,rw /
\end{verbatim}
\begin{lstlisting}[language=bash]
-chmod u+x etc/rc.d/rcS
+sudo chmod u+x etc/init.d/rcS
\end{lstlisting}
\end{frame}
\begin{frame}[containsverbatim]
\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
-4) Libraries kopieren
\begin{lstlisting}[language=bash]
# Loader
-$ cp /path_to_my_libc/lib/ld.so.1 \
-/tftpboot/nfsroot/lib
+$ sudo cp \
+/home/devel/CodeSourcery/Sourcery_G++_Lite/\
+arm-none-linux-gnueabi/libc/lib/ld-* lib/
# Getting the dependencies and copy them
-$ powerpc-linux-gnu-objdump -x \
+$ arm-none-linux-gnueabi-objdump -x \
/tftpboot/nfsroot/bin/busybox | grep NEEDED
NEEDED libm.so.6
NEEDED libc.so.6
-$ cp /path_to_my_libc/lib/libm.so.6 \
+$ sudo cp /path_to_my_libc/lib/libm.so.6 \
/tftpboot/nfsroot/lib
-$ cp /path_to_my_libc/lib/libc.so.6 \
+$ sudo cp /path_to_my_libc/lib/libc.so.6 \
/tftpboot/nfsroot/lib
\end{lstlisting}
\end{frame}
\begin{frame}[containsverbatim]
\frametitle{Erstellen eines Rootfilesystems für die Zielarchitektur}
-5) Berechtigungen korrigieren:
\begin{lstlisting}[language=bash]
-chown -R root:root /tftpboot/nfsroot
+sudo chown -R root:root /tftpboot/nfsroot
\end{lstlisting}
That's it!! :)
\end{frame}
@@ -186,46 +185,47 @@ That's it!! :)
\subsubsection{Konfiguration}
\begin{frame}[containsverbatim]
\frametitle{Exportieren per NFS}
-1) nfs-kernel-server installieren
\begin{lstlisting}
# Auf Debian basierten Systemen (als root)
-apt-get install nfs-kernel-server
+sudo apt-get install nfs-kernel-server
\end{lstlisting}
\end{frame}
\begin{frame}[containsverbatim]
\frametitle{Exportieren per NFS}
2) Directory exportieren
\begin{lstlisting}[language=bash]
-vim /etc/exports
+sudo vim /etc/exports
\end{lstlisting}
\begin{verbatim}
/tftpboot/nfsroot \
-192.168.0.0/255.255.255.0\
-(rw,no_root_squash,no_subtree_check,insecure) \
-127.0.0.1\
-(rw,no_root_squash,no_subtree_check,insecure) \
-10.0.2.0/255.255.255.0\
+192.168.2.0/255.255.255.0\
(rw,no_root_squash,no_subtree_check,insecure)
\end{verbatim}
\begin{lstlisting}[language=bash]
/etc/init.d/nfs-kernel-server restart
\end{lstlisting}
\end{frame}
-\subsubsection{Filesystem mit Qemu testen}
-\begin{frame}[containsverbatim]
-\frametitle{RFS mit Qemu booten}
-\begin{lstlisting}
-qemu-system-ppc -nographic \
--kernel images/vmlinux \
--append \
-"console=ttyS0 ip=dhcp \
-root=/dev/nfs \
-nfsroot=10.0.2.2:/tftpboot/nfsroot" \
--net nic -net user
-\end{lstlisting}
+\subsubsection{Filesystem testen}
+
+\begin{frame}[fragile]
+\frametitle{U-Boot setup}
+\small
+\begin{verbatim}
+setenv serverip 192.168.2.1
+
+setenv nfsargs 'setenv bootargs console=${console}
+vram=${vram} omapfb.mode=dvi:${dvimode} omapfb.debug=y
+omapdss.def_disp=${defaultdisplay} root=/dev/nfs
+nfsroot=${serverip}:/tftpboot/nfsroot rootwait
+ip=dhcp devtmpfs.mount=0'
+
+setenv bootcmd 'mmc init; run nfsargs;
+fatload mmc 0 80200000 uImage.bin; bootm 80200000'
+\end{verbatim}
\end{frame}
+
\begin{frame}[containsverbatim]
-\frametitle{RFS mit Qemu booten}
+\frametitle{RFS booten}
\begin{verbatim}
[...]
IP-Config: Got DHCP answer from 10.0.2.2, my address
@@ -247,6 +247,42 @@ Please press Enter to activate this console.
Ihr erstes eigenes Linux System!! :)
\end{frame}
+\begin{frame}[fragile]
+\frametitle{Startskript erweitern}
+\begin{lstlisting}[language=bash]
+cd /tftpboot/nfsroot
+sudo mkdir dev/pts
+sudo vim /tftpboot/nfsroot/etc/init.d/rcS
+\end{lstlisting}
+\begin{lstlisting}[language=bash]
+[...]
+mount devpts /dev/pts -t devpts
+
+tcpsvd -vE 0.0.0.0 21 ftpd -w / &
+\end{lstlisting}
+\end{frame}
+
+\subsection{RFS um FTPD erweitern}
+\begin{frame}[fragile]
+\frametitle{FTP testen}
+Auf dem Host:
+\begin{verbatim}
+$ dd if=/dev/zero of=bla bs=512 count=1
+[...]
+$ ftp 192.168.2.2
+Connected to 192.168.2.2
+220 Operation successful
+Name (192.168.2.2:devel): root
+230 Operation successful
+[...]
+ftp> put bla
+local: bla remote: bla
+200 Operation successful
+150 Ok to send data
+[...]
+\end{verbatim}
+\end{frame}
+
\subsection{RFS um SSH erweitern}
\begin{frame}
\frametitle{dropbear}
@@ -269,7 +305,7 @@ und wird daher recht häufig in Embedded Systemen verwendet.
\begin{frame}[containsverbatim]
\frametitle{Dropbear übersetzen}
\begin{lstlisting}[language=bash]
-$ ./configure --host=powerpc-linux-gnu \
+$ ./configure --host=arm-none-linux-gnueabi \
--disable-zlib --prefix=/usr
make
# Als root
@@ -291,14 +327,17 @@ und kopieren an die richtige Stelle im RFS.
\begin{frame}[containsverbatim]
\frametitle{Dropbear: Benötigte Bibliotheken / Lösung}
\begin{lstlisting}[language=bash]
-$ powerpc-linux-gnu-objdump -x \
-/tftpboot/nfsroot/usr/sbin/dropbear | grep NEEDED
+$ arm-none-linux-gnueabi-objdump -x \
+/tftpboot/nfsroot/usr/sbin/dropbear | \
+grep NEEDED
NEEDED libutil.so.1
NEEDED libcrypt.so.1
- NEEDED libc.so.
-$ cp /path_to_my_libc/libcrypt.so.1 \
+[...]
+$ sudo cp /path_to_my_libc/libcrypt.so.1 \
/tftpboot/nfsroot/lib
-$ cp /path_to_my_libc/libutil.so.1 \
+$ sudo cp /path_to_my_libc/libutil.so.1 \
+ /tftpboot/nfsroot/lib
+$ sudo cp /path_to_my_libc/libgcc_s.so.1 \
/tftpboot/nfsroot/lib
\end{lstlisting}
\end{frame}
@@ -307,27 +346,23 @@ $ cp /path_to_my_libc/libutil.so.1 \
\frametitle{RFS um SSH erweitern}
Vorbereitungen:
\begin{lstlisting}[language=bash]
+sudo su
cd /tftpboot/nfsroot
mknod dev/urandom c 1 9
mknod dev/ptmx c 5 2
+
mkdir root
+mkdir etc/dropbear
+
echo "root:x:0:0::/root:/bin/sh" >> etc/passwd
echo "root:x:0:" >> etc/group
-mkdir dev/pts
-mkdir etc/dropbear
+exit
\end{lstlisting}
\end{frame}
\begin{frame}[containsverbatim]
\frametitle{Password für root setzen}
\begin{lstlisting}[language=bash]
-qemu-system-ppc -nographic \
--kernel images/vmlinux \
--append "console=ttyS0 ip=dhcp root=/dev/nfs \
-nfsroot=10.0.2.2:/tftpboot/nfsroot" \
--net nic -net user,hostfwd=tcp::12345-:22
-\end{lstlisting}
-\begin{lstlisting}[language=bash]
# Im gebooteten System:
passwd
\end{lstlisting}
@@ -336,13 +371,10 @@ passwd
\begin{frame}[containsverbatim]
\frametitle{Dropbear: Startskript erweitern}
\begin{lstlisting}[language=bash]
-vim /tftpboot/nfsroot/etc/init.d/rcS
+sudo vim /tftpboot/nfsroot/etc/init.d/rcS
\end{lstlisting}
\begin{lstlisting}[language=bash,basicstyle=\ttfamily\fontsize{7}{7}\selectfont]
[...]
-
-mount devpts /dev/pts -t devpts
-
if [ ! -f /etc/dropbear/dropbear_rsa_host_key ]
then
dropbearkey -type rsa -f /etc/dropbear/dropbear_rsa_host_key
@@ -359,29 +391,55 @@ fi
\begin{frame}[containsverbatim]
\frametitle{SSH testen}
-\begin{enumerate}
-\item Qemu session starten:
-\begin{lstlisting}[language=bash]
-qemu-system-ppc -nographic \
--kernel images/vmlinux \
--append "console=ttyS0 ip=dhcp root=/dev/nfs \
-nfsroot=10.0.2.2:/tftpboot/nfsroot" \
--net nic -net user,hostfwd=tcp::12345-:22
-\end{lstlisting}
-\item Vom Host-System:
+Vom Host-System:
\begin{lstlisting}[language=bash]
-ssh -p 12345 root@localhost
+ssh root@192.168.2.2
\end{lstlisting}
\begin{verbatim}
root@localhost's password:
#
\end{verbatim}
-\end{enumerate}
\end{frame}
-\subsection{Filesystem auf dem Target testen}
-\begin{frame}
-\frametitle{Auf dem Target}
-HAND'S ON! :)
+\subsection{Filesystem für Remote Debugging vorbereiten}
+\begin{frame}[fragile]
+\frametitle{gdbserver und libthread\_db}
+\begin{lstlisting}[language=bash]
+$ cp /home/devel/CodeSourcery/Sourcery_G++_Lite/\
+arm-none-linux-gnueabi/\
+libc/lib/libthread_db.so.1 lib/
+
+$ sudo cp /home/devel/CodeSourcery/Sourcery_G++_Lite/\
+arm-none-linux-gnueabi/\
+libc/lib/libdl.so.2 lib/
+
+$ sudo cp /home/devel/CodeSourcery/Sourcery_G++_Lite/\
+arm-none-linux-gnueabi/\
+libc/usr/bin/gdbserver bin/
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Remotedebugging}
+\begin{lstlisting}[language=bash]
+$ arm-none-linux-gnueabi-gcc -Wall \
+-Wextra -g -O0 \
+-o cross_hello cross_hello.c
+sudo cp cross_hello /tftpboot /nfsroot
+\end{lstlisting}
+\begin{lstlisting}[language=bash]
+$ gdbserver :2345 /cross_hello
+Process /cross_hello created; pid = 65
+Listening on port 2345
+\end{lstlisting}
+\begin{lstlisting}[language=bash]
+$ arm-none-linux-gnueabi-gdb cross_hello
+(gdb) set solib-absolute-prefix \
+/home/devel/CodeSourcery/Sourcery_G++_Lite/\
+arm-none-linux-gnueabi/libc
+(gdb) target remote 10.10.0.Y:2345
+Remote debugging using 10.10.0.Y:2345
+[...]
+\end{lstlisting}
\end{frame}
\end{document}
diff --git a/application-devel/devel-scenarios/Makefile b/application-devel/devel-scenarios/Makefile
new file mode 100644
index 0000000..4663d52
--- /dev/null
+++ b/application-devel/devel-scenarios/Makefile
@@ -0,0 +1,9 @@
+all:
+ for pdf in `ls -1 *.tex` ; do \
+ pdflatex $$pdf; \
+ pdflatex $$pdf; \
+ done
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/application-devel/devel-scenarios/images/cygwin.dia b/application-devel/devel-scenarios/images/cygwin.dia
new file mode 100644
index 0000000..9f243e2
--- /dev/null
+++ b/application-devel/devel-scenarios/images/cygwin.dia
Binary files differ
diff --git a/application-devel/devel-scenarios/images/cygwin.png b/application-devel/devel-scenarios/images/cygwin.png
new file mode 100644
index 0000000..0613769
--- /dev/null
+++ b/application-devel/devel-scenarios/images/cygwin.png
Binary files differ
diff --git a/application-devel/devel-scenarios/images/linux_server.dia b/application-devel/devel-scenarios/images/linux_server.dia
new file mode 100644
index 0000000..8ae138b
--- /dev/null
+++ b/application-devel/devel-scenarios/images/linux_server.dia
Binary files differ
diff --git a/application-devel/devel-scenarios/images/linux_server.png b/application-devel/devel-scenarios/images/linux_server.png
new file mode 100644
index 0000000..cf541b1
--- /dev/null
+++ b/application-devel/devel-scenarios/images/linux_server.png
Binary files differ
diff --git a/application-devel/devel-scenarios/images/vmware.dia b/application-devel/devel-scenarios/images/vmware.dia
new file mode 100644
index 0000000..7a4addd
--- /dev/null
+++ b/application-devel/devel-scenarios/images/vmware.dia
Binary files differ
diff --git a/application-devel/devel-scenarios/images/vmware.png b/application-devel/devel-scenarios/images/vmware.png
new file mode 100644
index 0000000..b8aca2f
--- /dev/null
+++ b/application-devel/devel-scenarios/images/vmware.png
Binary files differ
diff --git a/application-devel/devel-scenarios/pres_devel_scenarios_de.tex b/application-devel/devel-scenarios/pres_devel_scenarios_de.tex
new file mode 100644
index 0000000..12a9842
--- /dev/null
+++ b/application-devel/devel-scenarios/pres_devel_scenarios_de.tex
@@ -0,0 +1,133 @@
+\documentclass[11pt]{beamer}
+
+%\usepackage{ngerman}
+\usepackage{times}
+\usepackage{graphicx}
+\usepackage{pgf,pgfarrows,pgfnodes,pgfautomata,pgfheaps}
+\usepackage{amsmath,amssymb}
+\usepackage[utf8]{inputenc}
+\usepackage{listings,color}
+\definecolor{lbcolor}{RGB}{255,210,150}
+\lstset{
+ language=C++,
+ numbers=left,
+ stepnumber=1,
+ numbersep=5pt,
+ numberstyle=\tiny,
+ breaklines=true,
+ breakautoindent=true,
+ postbreak=\space,
+ tabsize=2,
+ basicstyle=\ttfamily\footnotesize,
+ showspaces=false,
+ showstringspaces=false,
+ extendedchars=true,
+ backgroundcolor=\color{lbcolor},
+ keywordstyle=\bf ,
+ commentstyle=\color{green},
+ stringstyle=\color{red}
+}
+
+\mode<presentation>
+{
+ \usetheme{linutronix}
+}
+
+% on the following slides, include icon in the left sidebar
+\def\lximg{/usr/share/lx/icons/fueller.png}
+
+\title{Mögliche Szenarien zur Entwicklung für Linux}
+\institute{Linutronix GmbH}
+
+\begin{document}
+
+\frame{ \titlepage }
+
+% stop displaying 'fueller.png' on the following slides
+\def\lximg{none}
+
+%\AtBeginSection[]
+%{
+% \begin{frame}<beamer>
+% \tableofcontents[currentsection,currentsubsection]
+% \end{frame}
+%}
+
+\AtBeginSubsection[]
+{
+ \begin{frame}<beamer>
+ \tableofcontents[currentsection,currentsubsection]
+ \end{frame}
+}
+
+\begin{frame}
+ \tableofcontents
+\end{frame}
+
+%\includegraphics[height=0.8\textheight]{img/orb.jpg}
+\section{Enwicklungsszenarien}
+\subsection{Zentraler Entwicklungsserver}
+
+\begin{frame}
+\frametitle{Zentraler Linuxserver}
+\includegraphics[height=0.8\textheight]{images/linux_server.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Zentraler Linuxserver: Vorteile / Nachteile}
+Vorteile:
+\begin{itemize}
+\item Zentrale Wartung
+\item Einfache Integration
+\item Sehr leistungsfähig
+\item In fast jedem Szenario zu integrieren
+\end{itemize}
+Nachteile:
+\begin{itemize}
+\item Hohe Systemanforderungen
+\item Wartung: IT Know How
+\end{itemize}
+\end{frame}
+
+\subsection{Linux in VM-Ware}
+\begin{frame}
+\frametitle{Linux in VM-Ware}
+\includegraphics[height=0.8\textheight]{images/vmware.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Linux in VM-Ware: Vor- / Nachteile}
+Vorteile:
+\begin{itemize}
+\item Sehr einfach aufzusetzen
+\item Einfach zu verteilen
+\end{itemize}
+Nachteile:
+\begin{itemize}
+\item Verwaltungs- / Versionierungsaufwand für virtuelle Maschinen
+\item Performance
+\end{itemize}
+\end{frame}
+
+\subsection{Nativ unter Windows}
+\begin{frame}
+\frametitle{Nativ unter Windows}
+\includegraphics[height=0.8\textheight]{images/cygwin}
+\end{frame}
+
+\begin{frame}
+\frametitle{Nativ unter Windows: Vor- / Nachteile}
+Vorteile:
+\begin{itemize}
+\item Auch in reinen Windowsumgebungen einsetzbar
+\end{itemize}
+Nachteile:
+\begin{itemize}
+\item Toolchainintegration sehr schwer
+\item Extrem fehleranfällig
+\item Viele Werkzeuge nicht oder nur eingeschränkt verfügbar
+\item Erfahrungsgemäß wesentliche Einbuße an Produktivität
+\end{itemize}
+\end{frame}
+
+\end{document}
diff --git a/application-devel/posix-ipc/Makefile b/application-devel/posix-ipc/Makefile
new file mode 100644
index 0000000..4663d52
--- /dev/null
+++ b/application-devel/posix-ipc/Makefile
@@ -0,0 +1,9 @@
+all:
+ for pdf in `ls -1 *.tex` ; do \
+ pdflatex $$pdf; \
+ pdflatex $$pdf; \
+ done
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/application-devel/posix-ipc/pres_posix_ipc_de.tex b/application-devel/posix-ipc/pres_posix_ipc_de.tex
new file mode 100644
index 0000000..cd5027e
--- /dev/null
+++ b/application-devel/posix-ipc/pres_posix_ipc_de.tex
@@ -0,0 +1,414 @@
+\documentclass[11pt]{beamer}
+
+%\usepackage{ngerman}
+\usepackage{times}
+\usepackage{graphicx}
+\usepackage{pgf,pgfarrows,pgfnodes,pgfautomata,pgfheaps}
+\usepackage{amsmath,amssymb}
+\usepackage[utf8]{inputenc}
+\usepackage{listings,color}
+\definecolor{lbcolor}{RGB}{255,210,150}
+\lstset{
+ language=C,
+ numbers=left,
+ stepnumber=1,
+ numbersep=5pt,
+ numberstyle=\tiny,
+ breaklines=true,
+ breakautoindent=true,
+ postbreak=\space,
+ tabsize=2,
+ basicstyle=\ttfamily\fontsize{7}{9}\selectfont,
+ showspaces=false,
+ showstringspaces=false,
+ extendedchars=true,
+ backgroundcolor=\color{lbcolor},
+ keywordstyle=\bf ,
+ commentstyle=\color{green},
+ stringstyle=\color{red}
+}
+
+\mode<presentation>
+{
+ \usetheme{linutronix}
+}
+
+% on the following slides, include icon in the left sidebar
+\def\lximg{/usr/share/lx/icons/fueller.png}
+
+\title{POSIX IPC}
+\institute{Linutronix GmbH}
+
+\begin{document}
+
+\frame{ \titlepage }
+
+% stop displaying 'fueller.png' on the following slides
+\def\lximg{none}
+
+%\AtBeginSection[]
+%{
+% \begin{frame}<beamer>
+% \tableofcontents[currentsection,currentsubsection]
+% \end{frame}
+%}
+
+\AtBeginSubsection[]
+{
+ \begin{frame}<beamer>
+ \tableofcontents[currentsection,currentsubsection]
+ \end{frame}
+}
+
+\begin{frame}
+ \tableofcontents
+\end{frame}
+
+\begin{frame}
+\frametitle{POSIX IPC: Übersicht}
+\begin{itemize}
+\item Message Queues
+\item Semaphores
+\item Shared Memory
+\end{itemize}
+\end{frame}
+
+\section{Message Queues}
+\begin{frame}
+\frametitle{POSIX Message Queues}
+\begin{itemize}
+\item Austausch von Daten in Form von Messages
+\item Messages sind priorisierbar
+\item Höchste Priorität wird zuerst ausgeliefert
+\item Virtuelles Filesystem unter /dev/mqueue
+\end{itemize}
+\end{frame}
+
+
+\begin{frame}[fragile]
+\frametitle{POSIX Message Queues: API}
+Message Queue öffnen / neu anlegen:
+\begin{lstlisting}
+ #include <fcntl.h>
+ #include <sys/stat.h>
+ #include <mqueue.h>
+
+ mqd_t mq_open(const char *name, int oflag);
+ mqd_t mq_open(const char *name, int oflag,
+ mode_t mode, struct mq_attr *attr);
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{POSIX Message Queues: API}
+Message Queue schliessen:
+\begin{lstlisting}
+ #include <mqueue.h>
+
+ mqd_t mq_close(mqd_t mqdes);
+\end{lstlisting}
+Message Queue löschen:
+\begin{lstlisting}
+ #include <mqueue.h>
+
+ mqd_t mq_unlink(const char *name);
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{POSIX Message Queues: API}
+Messages senden:
+\begin{lstlisting}
+#include <mqueue.h>
+
+mqd_t mq_send(mqd_t mqdes, const char *msg_ptr,
+ size_t msg_len, unsigned msg_prio);
+
+#define _XOPEN_SOURCE 600
+#include <time.h>
+#include <mqueue.h>
+
+mqd_t mq_timedsend(mqd_t mqdes, const char *msg_ptr,
+ size_t msg_len, unsigned msg_prio,
+ const struct timespec *abs_timeout);
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{POSIX Message Queues: API}
+Messages empfangen:
+\begin{lstlisting}
+#include <mqueue.h>
+
+ssize_t mq_receive(mqd_t mqdes, char *msg_ptr,
+ size_t msg_len, unsigned *msg_prio);
+
+#define _XOPEN_SOURCE 600
+#include <time.h>
+#include <mqueue.h>
+
+ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr,
+ size_t msg_len, unsigned *msg_prio,
+ const struct timespec *abs_timeout);
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{POSIX Message Queues: Beispiel}
+Sender:
+\begin{lstlisting}
+const char message[] = "Hallo\0";
+mqd_t ret;
+
+mqd_t mq = mq_open ("/my_queue", O_RDWR |
+ O_CREAT | O_EXCL, 0664, NULL);
+if (mq < 0) {
+ perror("Can't open message queue\n");
+ exit(1);
+}
+
+ret = mq_send(mq, message, sizeof(message), 100);
+if(ret < 0)
+ perror("Can't send message\n");
+
+mq_close(mq);
+return 0;
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{POSIX Message Queues: Beispiel}
+Empfänger:
+\begin{lstlisting}
+char message[8192];
+unsigned prio;
+mqd_t ret;
+
+mqd_t mq = mq_open ("/my_queue", O_RDONLY);
+if(mq < 0) {
+ perror("Can't open message queue\n");
+ exit(1);
+}
+
+ret = mq_receive(mq, message, 8192, &prio);
+if (ret < 0)
+ perror("Nothing to receive\n");
+else
+ printf("Received message %s with prio %u\n", message, prio);
+
+mq_close(mq);
+mq_unlink("/my_queue");
+return 0;
+\end{lstlisting}
+\end{frame}
+
+\section{Semaphoren}
+\begin{frame}
+\frametitle{POSIX Semaphoren: Übersicht}
+\begin{itemize}
+\item Synchronisation von Threads und Prozessen
+\item Named Semaphores
+\item Unnamed Semaphores (memory based)
+\item Virtuelles Filesystem unter /dev/shm
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Named Semaphores: API}
+Semaphore öffnen / neu erstellen:
+\begin{lstlisting}
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <semaphore.h>
+
+sem_t *sem_open(const char *name, int oflag);
+sem_t *sem_open(const char *name, int oflag,
+ mode_t mode, unsigned int value);
+
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Named Semaphores: API}
+Unlock auf Semaphore:
+\begin{lstlisting}
+#include <semaphore.h>
+
+int sem_post(sem_t *sem);
+\end{lstlisting}
+Lock auf Semaphore:
+\begin{lstlisting}
+#include <semaphore.h>
+
+int sem_wait(sem_t *sem);
+
+int sem_trywait(sem_t *sem);
+
+int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Named Semaphores: API}
+Semaphore schliessen:
+\begin{lstlisting}
+#include <semaphore.h>
+
+int sem_close(sem_t *sem);
+\end{lstlisting}
+Semaphore löschen:
+\begin{lstlisting}
+#include <semaphore.h>
+
+int sem_unlink(const char *name);
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}
+\frametitle{Unnamed Semaphores: Übersicht}
+\begin{itemize}
+\item Liegen in einem gemeinsamen Speicherbereich (z.B. Shared Memory)
+\item Müssen mit sem\_init() initialisiert werden
+\item Lock und Unlock mit sem\_post() und sem\_wait()
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Unnamed Semaphores: API}
+Initialisieren:
+\begin{lstlisting}
+#include <semaphore.h>
+
+int sem_init(sem_t *sem, int pshared, unsigned int value);
+\end{lstlisting}
+Zerstören:
+\begin{lstlisting}
+#include <semaphore.h>
+
+int sem_destroy(sem_t *sem);
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Semaphoren: Beispiel}
+\begin{lstlisting}
+sem_t *my_sem;
+int ret;
+
+my_sem = sem_open("/my_sem", O_RDWR | O_CREAT | O_EXCL, 0644, 0);
+if (my_sem == SEM_FAILED) {
+ perror("Can't open semaphore\n");
+ exit(1);
+}
+
+ret = sem_wait(my_sem);
+if(ret < 0) {
+ perror("sem_wait failed\n");
+ exit(1);
+}
+printf("Here I am :)\n");
+
+sem_close(my_sem);
+return 0;
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Semaphoren: Beispiel}
+\begin{lstlisting}
+sem_t *my_sem;
+int ret;
+
+my_sem = sem_open("/my_sem", O_RDWR);
+if(my_sem == SEM_FAILED) {
+ perror("Can't open semaphore\n");
+ exit(1);
+}
+
+ret = sem_post(my_sem);
+if (ret < 0)
+ perror("sem_post\n");
+
+sem_close(my_sem);
+
+return 0;
+\end{lstlisting}
+\end{frame}
+
+\section{Shared Memory}
+\begin{frame}
+\frametitle{Shared Memory: Übersicht}
+\begin{itemize}
+\item Gemeinsam genutzter Speicherbereich
+\item mmap()
+\item Virtuelles Filesystem unter /dev/shm
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Shared Memory: API}
+Shared Memory anlegen / zerstören
+\begin{lstlisting}
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int shm_open(const char *name, int oflag, mode_t mode);
+
+int shm_unlink(const char *name);
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Shared Memory: Beispiel}
+\begin{lstlisting}
+ int fd; int ret = 1; char *addr;
+
+ fd = shm_open("my_shm", O_RDWR | O_CREAT, 0777);
+ if (fd < 0) {
+ perror("Can't open Shared Memory\n");
+ goto out;
+ }
+ if (ftruncate(fd, 4096) == -1) {
+ perror("ltrunc\n");
+ goto out;
+ }
+ addr = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (addr == MAP_FAILED) {
+ perror("mmap() failed\n");
+ goto out;
+ }
+ ret = 0;
+ *addr = 'A';
+out:
+ close(fd);
+ return ret;
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Shared Memory: Beispiel}
+\begin{lstlisting}
+ int fd;
+ int ret = 1;
+ char *addr;
+
+ fd = shm_open("my_shm", O_RDWR, 0777);
+ if (fd < 0) {
+ perror("Can't open Shared Memory\n");
+ goto out;
+ }
+
+ addr = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (addr == MAP_FAILED) {
+ perror("mmap() failed\n");
+ goto out;
+ }
+ printf("Reading from SHM -> %c\n", *addr);
+ ret = 0;
+out:
+ close(fd);
+ return ret;
+\end{lstlisting}
+\end{frame}
+\end{document}
diff --git a/protocols/socketcan/Makefile b/protocols/socketcan/Makefile
new file mode 100644
index 0000000..4663d52
--- /dev/null
+++ b/protocols/socketcan/Makefile
@@ -0,0 +1,9 @@
+all:
+ for pdf in `ls -1 *.tex` ; do \
+ pdflatex $$pdf; \
+ pdflatex $$pdf; \
+ done
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/protocols/socketcan/pres_socketcan_de.tex b/protocols/socketcan/pres_socketcan_de.tex
new file mode 100644
index 0000000..d57d079
--- /dev/null
+++ b/protocols/socketcan/pres_socketcan_de.tex
@@ -0,0 +1,206 @@
+\documentclass[11pt]{beamer}
+
+%\usepackage{ngerman}
+\usepackage{times}
+\usepackage{graphicx}
+\usepackage{pgf,pgfarrows,pgfnodes,pgfautomata,pgfheaps}
+\usepackage{amsmath,amssymb}
+\usepackage[utf8]{inputenc}
+\usepackage{listings,color}
+\definecolor{lbcolor}{RGB}{255,210,150}
+\lstset{
+ language=C,
+ numbers=left,
+ stepnumber=1,
+ numbersep=5pt,
+ numberstyle=\tiny,
+ breaklines=true,
+ breakautoindent=true,
+ postbreak=\space,
+ tabsize=2,
+ basicstyle=\ttfamily\fontsize{7}{9}\selectfont,
+ showspaces=false,
+ showstringspaces=false,
+ extendedchars=true,
+ backgroundcolor=\color{lbcolor},
+ keywordstyle=\bf ,
+ commentstyle=\color{green},
+ stringstyle=\color{red}
+}
+
+\mode<presentation>
+{
+ \usetheme{linutronix}
+}
+
+% on the following slides, include icon in the left sidebar
+\def\lximg{/usr/share/lx/icons/fueller.png}
+
+\title{Can unter Linux: SocketCAN}
+\institute{Linutronix GmbH}
+
+\begin{document}
+
+\frame{ \titlepage }
+
+% stop displaying 'fueller.png' on the following slides
+\def\lximg{none}
+
+%\AtBeginSection[]
+%{
+% \begin{frame}<beamer>
+% \tableofcontents[currentsection,currentsubsection]
+% \end{frame}
+%}
+\begin{frame}
+\frametitle{Übersicht}
+\begin{itemize}
+\item Als neues Netzwerkprotokoll integriert
+\item PF\_CAN
+\item CAN Kommunikation über Sockets
+\item Konfiguration und Debugging über Netzwerktools
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Virtual CAN interface}
+\begin{verbatim}
+sudo modprobe vcan
+sudo ip link add dev vcan0 type vcan
+sudo ip link set up vcan0
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{ifconfig}
+\tiny
+\begin{verbatim}
+$ ifconfig
+...
+vcan0 Link encap:UNSPEC Hardware Adresse 00-00-00-00-00
+ UP RUNNING NOARP MTU:16 Metrik:1
+ RX packets:1 errors:0 dropped:0 overruns:0 frame:0
+ TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
+ Kollisionen:0 Sendewarteschlangenlänge:0
+ RX bytes:4 (4.0 B) TX bytes:4 (4.0 B)
+...
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{cansend / candump}
+cansend:
+\begin{verbatim}
+cansend vcan0 123#11223344
+\end{verbatim}
+candump:
+\begin{verbatim}
+$ candump vcan0
+ vcan0 123 [4] 11 22 33 44
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{cangen}
+\begin{verbatim}
+$ cangen vcan0 -I 123 -L 1 -D i
+\end{verbatim}
+\begin{verbatim}
+$ candump vcan0
+ vcan0 123 [1] 39
+ vcan0 123 [1] 3A
+ vcan0 123 [1] 3B
+ vcan0 123 [1] 3C
+ vcan0 123 [1] 3D
+ vcan0 123 [1] 3E
+ vcan0 123 [1] 3F
+ vcan0 123 [1] 40
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{cansniffer}
+cangen:
+\begin{verbatim}
+$ cangen vcan0 -I 123 -L 1 -D i
+\end{verbatim}
+cansniffer vcan0:
+\begin{verbatim}
+- time ID data ... < cansniffer vcan0 #
+0.200107 123 01000000
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Programmierbeispiel: can example}
+\begin{lstlisting}
+int skt = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+int bytes_sent, bytes_read, i;
+struct ifreq ifr;
+struct sockaddr_can addr;
+struct can_frame frame;
+
+strcpy(ifr.ifr_name, "vcan0");
+ioctl(skt, SIOCGIFINDEX, &ifr);
+
+addr.can_family = AF_CAN;
+addr.can_ifindex = ifr.ifr_ifindex;
+bind(skt, (struct sockaddr*)&addr, sizeof(addr));
+
+frame.can_id = 0x123;
+strcpy(frame.data, "tst");
+frame.can_dlc = strlen(frame.data);
+bytes_sent = write(skt, &frame, sizeof(frame));
+
+bytes_read = read(skt, &frame, sizeof(frame));
+for(i = 0; i < 4; i++)
+ printf("Recveived -> %X\n", frame.data[i]);
+
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Programmierbeispiel: can example}
+1)
+\begin{verbatim}
+$ ./can_example
+\end{verbatim}
+2)
+\begin{verbatim}
+$ candump vcan0
+ vcan0 123 [3] 66 6F 6F
+\end{verbatim}
+3)
+\begin{verbatim}
+$ cansend vcan0 123#11223344
+\end{verbatim}
+4) can\_example:
+\begin{verbatim}
+Received -> 11
+Received -> 22
+...
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{canlogserver}
+\begin{verbatim}
+$ canlogserver vcan0 &
+\end{verbatim}
+\begin{verbatim}
+$ cangen vcan0 -Di -I 42A -L1 &
+\end{verbatim}
+\begin{verbatim}
+$ telnet localhost 28700
+Trying ::1...
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+(1289664132.891896) vcan0 42A#00
+(1289664133.092037) vcan0 42A#01
+(1289664133.292138) vcan0 42A#02
+(1289664133.492246) vcan0 42A#03
+(1289664133.692351) vcan0 42A#04
+\end{verbatim}
+\end{frame}
+\end{document}