diff options
| author | John Ogness <john.ogness@linutronix.de> | 2019-02-18 15:05:17 +0106 |
|---|---|---|
| committer | John Ogness <john.ogness@linutronix.de> | 2019-02-18 15:05:17 +0106 |
| commit | 8e0289adea1ed37f2f41be12d01186d2f98b3625 (patch) | |
| tree | eb938d59b08530657b2d663cce0ff43f7eafad9e | |
| parent | efc176eef8a3f807775c34b739831fd9581bbf34 (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.png | bin | 0 -> 48870 bytes | |||
| -rw-r--r-- | images/at91_netzteil.png | bin | 0 -> 43271 bytes | |||
| -rw-r--r-- | images/at91_reset.png | bin | 0 -> 43190 bytes | |||
| -rw-r--r-- | images/at91_romboot_measure.png | bin | 0 -> 46255 bytes | |||
| -rw-r--r-- | images/at91_uboot_initramfs.png | bin | 0 -> 49264 bytes | |||
| -rw-r--r-- | images/boot_at91_overview.png | bin | 0 -> 129268 bytes | |||
| -rw-r--r-- | images/boot_at91_romboot.png | bin | 0 -> 171983 bytes | |||
| -rw-r--r-- | images/boot_overview.png | bin | 0 -> 103468 bytes | |||
| -rw-r--r-- | images/gpio_measure.png | bin | 0 -> 15085 bytes | |||
| -rw-r--r-- | misc/Makefile | 1 | ||||
| -rw-r--r-- | misc/pres_fastboot_de.tex | 565 |
11 files changed, 566 insertions, 0 deletions
diff --git a/images/at91_ipl_verbose_nolpj.png b/images/at91_ipl_verbose_nolpj.png Binary files differnew file mode 100644 index 0000000..503e4e7 --- /dev/null +++ b/images/at91_ipl_verbose_nolpj.png diff --git a/images/at91_netzteil.png b/images/at91_netzteil.png Binary files differnew file mode 100644 index 0000000..594049f --- /dev/null +++ b/images/at91_netzteil.png diff --git a/images/at91_reset.png b/images/at91_reset.png Binary files differnew file mode 100644 index 0000000..d9df553 --- /dev/null +++ b/images/at91_reset.png diff --git a/images/at91_romboot_measure.png b/images/at91_romboot_measure.png Binary files differnew file mode 100644 index 0000000..df56b79 --- /dev/null +++ b/images/at91_romboot_measure.png diff --git a/images/at91_uboot_initramfs.png b/images/at91_uboot_initramfs.png Binary files differnew file mode 100644 index 0000000..80946e6 --- /dev/null +++ b/images/at91_uboot_initramfs.png diff --git a/images/boot_at91_overview.png b/images/boot_at91_overview.png Binary files differnew file mode 100644 index 0000000..02bf096 --- /dev/null +++ b/images/boot_at91_overview.png diff --git a/images/boot_at91_romboot.png b/images/boot_at91_romboot.png Binary files differnew file mode 100644 index 0000000..c3b4505 --- /dev/null +++ b/images/boot_at91_romboot.png diff --git a/images/boot_overview.png b/images/boot_overview.png Binary files differnew file mode 100644 index 0000000..98dddee --- /dev/null +++ b/images/boot_overview.png diff --git a/images/gpio_measure.png b/images/gpio_measure.png Binary files differnew file mode 100644 index 0000000..c9553b0 --- /dev/null +++ b/images/gpio_measure.png 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} |
