summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ogness <john.ogness@linutronix.de>2019-02-18 15:05:17 +0106
committerJohn Ogness <john.ogness@linutronix.de>2019-02-18 15:05:17 +0106
commit8e0289adea1ed37f2f41be12d01186d2f98b3625 (patch)
treeeb938d59b08530657b2d663cce0ff43f7eafad9e
parentefc176eef8a3f807775c34b739831fd9581bbf34 (diff)
fastboot: add (german) fastboot slides
Taken from Jan's 2010 talk. These need to be converted to english! Signed-off-by: John Ogness <john.ogness@linutronix.de>
-rw-r--r--images/at91_ipl_verbose_nolpj.pngbin0 -> 48870 bytes
-rw-r--r--images/at91_netzteil.pngbin0 -> 43271 bytes
-rw-r--r--images/at91_reset.pngbin0 -> 43190 bytes
-rw-r--r--images/at91_romboot_measure.pngbin0 -> 46255 bytes
-rw-r--r--images/at91_uboot_initramfs.pngbin0 -> 49264 bytes
-rw-r--r--images/boot_at91_overview.pngbin0 -> 129268 bytes
-rw-r--r--images/boot_at91_romboot.pngbin0 -> 171983 bytes
-rw-r--r--images/boot_overview.pngbin0 -> 103468 bytes
-rw-r--r--images/gpio_measure.pngbin0 -> 15085 bytes
-rw-r--r--misc/Makefile1
-rw-r--r--misc/pres_fastboot_de.tex565
11 files changed, 566 insertions, 0 deletions
diff --git a/images/at91_ipl_verbose_nolpj.png b/images/at91_ipl_verbose_nolpj.png
new file mode 100644
index 0000000..503e4e7
--- /dev/null
+++ b/images/at91_ipl_verbose_nolpj.png
Binary files differ
diff --git a/images/at91_netzteil.png b/images/at91_netzteil.png
new file mode 100644
index 0000000..594049f
--- /dev/null
+++ b/images/at91_netzteil.png
Binary files differ
diff --git a/images/at91_reset.png b/images/at91_reset.png
new file mode 100644
index 0000000..d9df553
--- /dev/null
+++ b/images/at91_reset.png
Binary files differ
diff --git a/images/at91_romboot_measure.png b/images/at91_romboot_measure.png
new file mode 100644
index 0000000..df56b79
--- /dev/null
+++ b/images/at91_romboot_measure.png
Binary files differ
diff --git a/images/at91_uboot_initramfs.png b/images/at91_uboot_initramfs.png
new file mode 100644
index 0000000..80946e6
--- /dev/null
+++ b/images/at91_uboot_initramfs.png
Binary files differ
diff --git a/images/boot_at91_overview.png b/images/boot_at91_overview.png
new file mode 100644
index 0000000..02bf096
--- /dev/null
+++ b/images/boot_at91_overview.png
Binary files differ
diff --git a/images/boot_at91_romboot.png b/images/boot_at91_romboot.png
new file mode 100644
index 0000000..c3b4505
--- /dev/null
+++ b/images/boot_at91_romboot.png
Binary files differ
diff --git a/images/boot_overview.png b/images/boot_overview.png
new file mode 100644
index 0000000..98dddee
--- /dev/null
+++ b/images/boot_overview.png
Binary files differ
diff --git a/images/gpio_measure.png b/images/gpio_measure.png
new file mode 100644
index 0000000..c9553b0
--- /dev/null
+++ b/images/gpio_measure.png
Binary files differ
diff --git a/misc/Makefile b/misc/Makefile
index 2f9b38c..f766120 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -6,3 +6,4 @@ obj-$(CONFIG_MISC_BEST) += pres_best_en.pdf
obj-$(CONFIG_MISC_IPC) += pres_ipc_en.pdf
obj-$(CONFIG_MISC_UPDATE) += pres_update.pdf
obj-$(CONFIG_MISC_JAILHOUSE) += pres_jailhouse.pdf
+obj-$(CONFIG_MISC_FASTBOOT) += pres_fastboot_de.pdf
diff --git a/misc/pres_fastboot_de.tex b/misc/pres_fastboot_de.tex
new file mode 100644
index 0000000..d8aed51
--- /dev/null
+++ b/misc/pres_fastboot_de.tex
@@ -0,0 +1,565 @@
+\input{configpres}
+
+\section{Grundlagen}
+
+\title{Linux Fastboot}
+\maketitle
+
+\subsection{Motivation}
+\begin{frame}
+\frametitle{Motivation}
+\begin{itemize}
+\item Immer höhere Anforderungen an Energiesparfunktionen
+\item Laufzeit von Multimediageräten
+\item Automotiveanwendungen
+\pause
+\item \textbf{Lösung:} Im Ruhezustand ausschalten
+\pause
+\item \textbf{Aber:} Nutzer sind nicht gewohnt zu ''warten''
+\end{itemize}
+\end{frame}
+
+\subsection{Theoretische Grundlagen}
+\begin{frame}
+\frametitle{Der erste Schritt: Anforderungsdefinition}
+\begin{itemize}
+\item Wo liegt die Obergrenze für die Bootzeit?
+\item Welche Funktionalität muß nach dieser Zeit zur Verfügung stehen?
+\item Geschwindigkeit vs. Flexibilität
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Bootprozeß}
+\includegraphics[height=0.7\textheight]{images/boot_overview.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Teilkomponenten des Bootprozesses}
+\begin{itemize}
+\item Hardware-Reset
+\item Bootloader
+\item Betriebssystem (Laden von Treibern, Einbinden des Dateisystems)
+\item Startskripte / Applikation
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Kritische Hardwarekomponenten}
+\begin{itemize}
+\item Netzteil
+\item Resetlogik
+\item Bootlogik / Bootreihenfolge
+\item Anbindung des Bootmediums
+\item Anbindung der benötigten Peripherie
+\end{itemize}
+\textbf{Wichtig: Die Hardware ist wesentlicher Bestandteil eines
+Fastbootkonzeptes!!}
+\end{frame}
+
+\begin{frame}
+\frametitle{Bootloader}
+\begin{itemize}
+\item ''Basiskonfiguration'' der CPU
+\item Aufsetzen der sogenannten ATAGs Struktur
+\item Flushen der Caches
+\item Ausschalten der MMU
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Der Linux Kernel}
+\begin{itemize}
+\item Viele Funktionen zur Bootzeitoptimierung
+\item Sehr flexibel
+\item Kompression
+\item Möglichkeiten zur Parallelisierung von Initialisierungen
+\item Ca. 150ms - 250ms bis zum Einbinden des Dateisystems
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Die Applikation}
+\begin{itemize}
+\item In bestehenden Systemen oft am meisten Optimierungspotential
+\item Startskripte
+\item Linking
+\end{itemize}
+\end{frame}
+
+\section{Optimierungen}
+\subsection{Bootloader}
+\begin{frame}[fragile]
+\frametitle{Bootloader-Optimierungen (U-Boot) 1}
+Entfernen von im Feld nicht benötigten Features:
+\begin{lstlisting}
+/* include/configs/boardname.h */
+[...]
+#include <config_cmd_default.h>
+#undef CONFIG_CMD_NET
+[...]
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Bootloader-Optimierungen (U-Boot) 2}
+Verifizieren des Kernel Images:
+\begin{verbatim}
+setenv verify n
+\end{verbatim}
+Keine Ausgaben der U-Boot Konsole:
+\begin{verbatim}
+setenv silent 1
+\end{verbatim}
+Warten auf Nutzereingabe:
+\begin{verbatim}
+setenv bootdelay 0
+\end{verbatim}
+\end{frame}
+
+\begin{frame}
+\frametitle{Bootloader-Optimierungen IPL}
+\begin{itemize}
+\item Ersetzen eines ''general purpose'' Bootloaders durch einen optimierten IPL
+\item IPL auch Grundlage für Updatekonzepte aus IPL und ''Rescue Kernel''
+\end{itemize}
+\end{frame}
+
+\subsection{Kernel}
+\begin{frame}[fragile]
+\frametitle{Kerneloptimierungen: Teilkomponenten}
+\begin{itemize}
+\item Konfiguration und Build
+\item Kompression
+\item Bootparameter
+\item Treiberinitialisierungen
+\item Rootfilesystem
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Kerneloptimierungen: Konfiguration}
+\begin{verbatim}
+General setup --->
+Kernel compression mode -->
+\end{verbatim}
+\begin{itemize}
+\item LZO für Embeddedsysteme sehr interessant
+\item Kopieren vs. Dekomprimieren
+\item Für Speichermedien mit wahlfreiem Lesezugriff steht auch ''Execute in
+Place (XIP)'' zur Verfügung
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Kerneloptimierungen: Commandlineparameter}
+\begin{itemize}
+\item Delay Loop Calibration: ''lpj=''; Kann auf ARM9 Systemen > 100ms
+einsparen.
+\item Parameter zur Analyse der Laufzeit im Bootprozeß: ''initcall\_debug'',
+''printk\_time=1''
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Kerneloptimierungen: Delayloop}
+\begin{verbatim}
+...
+Calibrating delay loop...
+ 99.12 BogoMIPS (lpj=495616)
+...
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Kerneloptimierungen: initcall\_debug}
+\begin{verbatim}
+calling populate_rootfs+0x0/0x1f8 @ 1
+initcall populate_rootfs+0x0/0x1f8
+ returned 0 after 281 usecs
+calling timer_init_sysfs+0x0/0x38 @ 1
+initcall timer_init_sysfs+0x0/0x38
+ returned 0 after 590 usecs
+calling leds_init+0x0/0x3c @ 1
+initcall leds_init+0x0/0x3c
+ returned 0 after 488 usecs
+calling leds_init+0x0/0x50 @ 1
+initcall leds_init+0x0/0x50
+ returned -19 after 1 usecs
+calling fpe_init+0x0/0x78 @ 1
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Kerneloptimierungen: printk.time}
+\begin{verbatim}
+[ 0.800000] mice: PS/2 mouse device
+[ 0.810000] rtc-at91sam9 at91_rtt.0:
+[ 0.820000] rtc-at91sam9 at91_rtt.0:
+[ 0.830000] TCP cubic registered
+[ 0.830000] NET: Registered protocol
+[ 0.830000] rtc-at91sam9 at91_rtt.0:
+[ 2.610000] VFS: Mounted root (jffs2
+[ 2.610000] Freeing init memory: 116K
+\end{verbatim}
+\end{frame}
+
+\subsection{Dateisystem}
+\begin{frame}[fragile]
+\frametitle{InitRAMFS}
+\begin{verbatim}
+dir /dev 755 0 0
+nod /dev/console 644 0 0 c 5 1
+nod /dev/loop0 644 0 0 b 7 0
+dir /bin 755 1000 1000
+slink /bin/sh busybox 777 0 0
+file /bin/busybox initfs/busybox 755 0 0
+[...]
+dir /proc 755 0 0
+dir /sys 755 0 0
+dir /mnt 755 0 0
+\end{verbatim}
+\end{frame}
+
+\begin{frame}
+\frametitle{UbiFS}
+\begin{itemize}
+\item Für Linuxsysteme DAS Flashfilesystem der Wahl
+\item Geringe Mountzeit
+\item Power-Fail safe
+\item ...
+\end{itemize}
+\end{frame}
+
+\subsection{Applikation}
+
+\begin{frame}
+\frametitle{Optimierungen der Applikation}
+\begin{itemize}
+\item Analyse des Startprozesses mit bootchartd
+\item Ggf. direktes Starten der Applikation mit init=
+\item Dynamisches vs. statisches Linken
+\item Pre-Linking bei dynamisch gelinkten Applikationen
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Startskriptaufgaben in der Applikation}
+\begin{verbatim}
+ret = mount("sysfs", "/sys",
+ "sysfs", 0, NULL);
+
+if(ret < 0)
+ perror("Can't mount sysfs\n");
+\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Dynamisches Linken}
+\begin{enumerate}
+\item DT\_RPATH Sektion des ELF Executables
+\item Pfade, die in LD\_LIBRARY\_PATH spezifiziert sind
+\item DT\_RUNPATH Sektion des ELF Executables
+\item Binärfile /etc/ld.so.cache
+\item Defaultpfade /lib und /usr/lib
+\end{enumerate}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Dynamisches Linken: Analyse}
+\begin{verbatim}
+$ LD_DEBUG=libs ls
+ 3082: find library=librt.so.1 [0];
+ searching
+ 3082: search cache=/etc/ld.so.cache
+ 3082: trying file=/lib/librt.so.1
+\end{verbatim}
+\end{frame}
+
+\section{Beispiel}
+\subsection{Analyse des Testsystems}
+
+\begin{frame}
+\frametitle{Testsystem}
+\begin{itemize}
+\item ARM9 CPU der Atmel AT91 Serie
+\item Ausgangspunkt: Busybox Image der Angstrom Distribution
+\item Speichermedium: NAND-Flash
+\item Testapplikation: Toggeln eines GPIO über das SysFS GPIO-Interface
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Bootprozeß der AT91 Controller}
+\includegraphics[height=0.7\textheight]{images/boot_at91_overview.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Bootmodi der AT91 Familie}
+\begin{itemize}
+\item RomBOOT: Booten über eine interne Bootlogik
+\item Booten über CS0 des External Bus Interface
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{AT91 RomBOOT}
+\includegraphics[height=0.7\textheight]{images/boot_at91_romboot.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Einschaltverhalten / Netzteil}
+\includegraphics[height=0.7\textheight]{images/at91_netzteil.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Resetverhalten}
+\includegraphics[height=0.7\textheight]{images/at91_reset.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{RomBOOT}
+\includegraphics[height=0.7\textheight]{images/at91_romboot_measure.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Fazit / Hardwareoptimierungen}
+\begin{itemize}
+\item Internen Oszillator für Slowclock verwenden: > 1s Ersparnis
+\item Booten von CS0: ~100ms - 150ms Ersparnis
+\end{itemize}
+\end{frame}
+
+\subsection{Optimierung des Testsystems}
+
+\begin{frame}
+\frametitle{Bootzeitmessung mittels GPIO}
+\includegraphics[width=10cm]{images/gpio_measure.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Teilkomponenten der Bottzeitmessungen}
+\begin{itemize}
+\item Bootstrap bis U-Boot
+\item U-Boot bis Early-Boot-Code im Kernel (also inkl. Kopieren des Kernels
+ins RAM und entpacken des Kernels)
+\item Kernel bis Applikation (also inkl. Einbinden des Dateisystems)
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Initiales Bootverhalten}
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Uboot & --- \\
+\hline
+Uboot - Kernel & 6,5s \\
+\hline
+Kernel - Applikation & 4,5s \\
+\hline
+\textbf{Gesamt} & \textbf{11s} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{U-Boot ohne Netzwerkunterstützung}
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Uboot & --- \\
+\hline
+Uboot - Kernel & 4,25s \\
+\hline
+Kernel - Applikation & 4,5s \\
+\hline
+\textbf{Gesamt} & \textbf{8,75s} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{U-Boot verify=n}
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Uboot & --- \\
+\hline
+Uboot - Kernel & 3,89s \\
+\hline
+Kernel - Applikation & 4,5s \\
+\hline
+\textbf{Gesamt} & \textbf{8,39s} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{Kernel ''abspecken''}
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Uboot & --- \\
+\hline
+Uboot - Kernel & 3,77s \\
+\hline
+Kernel - Applikation & 4,33s \\
+\hline
+\textbf{Gesamt} & \textbf{8,1s} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{Analyse der Startskripte: Bootchartd}
+\includegraphics[height=0.85\textheight]{images/bootchart.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Optimieren der Startskripte}
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Uboot & --- \\
+\hline
+Uboot - Kernel & 3,77s \\
+\hline
+Kernel - Applikation & 3,61 \\
+\hline
+\textbf{Gesamt} & \textbf{7,38s} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{LZO komprimiertes InitRAMFS}
+Die Applikation wird direkt mit init= angestartet.
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Uboot & --- \\
+\hline
+Uboot - Kernel & 3,79s \\
+\hline
+Kernel - Applikation & 0,372s \\
+\hline
+\textbf{Gesamt} & \textbf{4,162s} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{Modifizierter AT91 Bootstrap}
+AT91 Bootstrap startet direkt Linux an. D.h. es wird ohne U-Boot gebootet.
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Kernel & 676ms \\
+\hline
+Kernel - Applikation & 584ms \\
+\hline
+\textbf{Gesamt} & \textbf{1,260s} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{lpj=}
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Kernel & 676ms \\
+\hline
+Kernel - Applikation & 384ms \\
+\hline
+\textbf{Gesamt} & \textbf{1,060s} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{Keine Ausgaben auf serielle Schnittstelle (quiet)}
+\begin{table}[!h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Kernel & 524ms \\
+\hline
+Kernel - Applikation & 212ms \\
+\hline
+\textbf{Gesamt} & \textbf{736ms} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{LZO komprimiertes Kernelimage}
+\begin{table}[h]
+\centering
+\begin{tabular}{ | c | c | }
+\hline
+Messpunkt & Zeit \\
+\hline
+Bootstrap - Kernel & 444ms \\
+\hline
+Kernel - Applikation & 212ms \\
+\hline
+\textbf{Gesamt} & \textbf{656ms} \\
+\hline
+\end{tabular}
+\end{table}
+\end{frame}
+
+\begin{frame}
+\frametitle{Bootverhalten nach den Optimierungen}
+\includegraphics[height=0.7\textheight]{images/at91_ipl_quiet_lpj_lzo.png}
+\end{frame}
+
+\begin{frame}
+\frametitle{Fazit}
+\begin{itemize}
+\item Linux bietet die optimale Plattform für jeden, der ein modernes
+Betriebssystem verwenden möchte, aber in weniger als 1s booten muß
+\item Bereits mit einfachen Optimierungen können mehrere Sekunden gespart werden
+\item Die Hardware ist wesentlicher Bestandteil eines Fastbootkonzeptes
+\item Konzept ist weitgehend plattformunabhängig
+\end{itemize}
+\end{frame}
+
+\input{tailpres}