diff options
| author | Manuel Traut <manut@linutronix.de> | 2010-10-17 19:08:49 +0200 |
|---|---|---|
| committer | Manuel Traut <manut@linutronix.de> | 2010-10-17 19:08:49 +0200 |
| commit | dfa18101f1836fa73518971020cede43de539f7d (patch) | |
| tree | 60b9281b4603afce918f12adfbdd67e39cfe3833 /kernel-devel | |
| parent | 58d2d02a1382d3b385584d543e6f8129920f8c25 (diff) | |
mv mm-basics to kernel-devel
Signed-off-by: Manuel Traut <manut@linutronix.de>
Diffstat (limited to 'kernel-devel')
5 files changed, 304 insertions, 23 deletions
diff --git a/kernel-devel/kernel-build/pres_kernel-build_de.tex b/kernel-devel/kernel-build/pres_kernel-build_de.tex deleted file mode 100644 index 1489f12..0000000 --- a/kernel-devel/kernel-build/pres_kernel-build_de.tex +++ /dev/null @@ -1,23 +0,0 @@ -\documentclass{beamer} -\usetheme{linutronix} -\usepackage{german} -\usepackage[utf8]{inputenc} -\usepackage{pgf} -\usepackage{graphicx} -\usepackage{lxextras} - -\title{Linux-Kernel konfigurieren und kompilieren} -\institute{Linutronix GmbH} - -\begin{document} - -\maketitle - - -% ----- Slide ------------------ -\begin{frame} -\frametitle{Hallo} -\end{frame} - - -\end{document} diff --git a/kernel-devel/linux-mm-basics/Makefile b/kernel-devel/linux-mm-basics/Makefile new file mode 100644 index 0000000..4663d52 --- /dev/null +++ b/kernel-devel/linux-mm-basics/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/kernel-devel/linux-mm-basics/handout_linux-mm-basics_en.tex b/kernel-devel/linux-mm-basics/handout_linux-mm-basics_en.tex new file mode 100644 index 0000000..4c391b2 --- /dev/null +++ b/kernel-devel/linux-mm-basics/handout_linux-mm-basics_en.tex @@ -0,0 +1,17 @@ +\documentclass{article} +\usepackage{german} +\usepackage[utf8]{inputenc} + +\begin{document} + +\section*{Titel} + +\subsection*{Abschnitt1} + +Text + +\subsection*{Abschnitt2} + +Text + +\end{document} diff --git a/kernel-devel/linux-mm-basics/hints_linux-mm-basics_en.tex b/kernel-devel/linux-mm-basics/hints_linux-mm-basics_en.tex new file mode 100644 index 0000000..b2b8a2b --- /dev/null +++ b/kernel-devel/linux-mm-basics/hints_linux-mm-basics_en.tex @@ -0,0 +1,25 @@ +\documentclass{article} +\usepackage{german} +\usepackage[utf8]{inputenc} + +\begin{document} + +\section*{Block \lq Linux-Prozesse\rq} + +\subsection*{Lernziele} +\begin{itemize} +\item Begriffe Prozess und Thread +\item Bedeutung von User-/Group-IDs, Executable-Flag +\item Verstehen, wie Prozesse unter Linux erzeugt werden +\item Kennenlernen der wichtigsten Tools +\end{itemize} + +\subsection*{Unterrichts-Ablauf} + +Hinweise zur Präsentation, Zeitplanung, etc. + +\subsection*{Ăœbungen bei vorhandener Hardware} + +Tools ps, top, kill + +\end{document} diff --git a/kernel-devel/linux-mm-basics/pres_linux-mm-basics_en.tex b/kernel-devel/linux-mm-basics/pres_linux-mm-basics_en.tex new file mode 100644 index 0000000..8ff0da7 --- /dev/null +++ b/kernel-devel/linux-mm-basics/pres_linux-mm-basics_en.tex @@ -0,0 +1,253 @@ +\documentclass{beamer} +\usetheme{linutronix} +\usepackage{german} +\usepackage[utf8]{inputenc} +\usepackage{pgf} +\usepackage{graphicx} + +\title{Linux Memory Management basics} +\institute{Linutronix GmbH} + +\begin{document} + +\maketitle +\begin{frame} +\frametitle{Overview} +\tableofcontents +\end{frame} + +\section{Basics} +\subsection{Overview} +\begin{frame} +\frametitle{Overview} +\begin{itemize} +\item over-committing +\item Copy-On-Write +\item Page relocation +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{over-committing} +\begin{itemize} +\item Comparable to those low-cost airlines ;) +\pause +\item ...selling more tickets than available seats +\pause +\item ...hoping not everyone will come ;) +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{over-commit settings} +\begin{verbatim} +/proc/sys/vm/overcommit_memory +\end{verbatim} +Possible settings are: +\begin{itemize} +\item 0: Heuristic overcommit handling (default) +\item 1: Always overcommit +\item 2: Don't overcommit +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{The OOM Killer} +...is invoked if you ask for more memory than available.\\ +\pause +\textbf{Result}: The kernel kills a task +\end{frame} + +\begin{frame} +\frametitle{Copy-On-Write} +\begin{itemize} +\item completely transparently for userspace +\item you don't need the same data twice +\item only updated if one virtual memory area is updated +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Page relocation} +\begin{itemize} +\item AKA paging or swapping +\item Linux can move a page to / from swap +\item also completely transparently for userspace +\end{itemize} +\end{frame} + +\subsection{The stack} +\begin{frame} +\frametitle{The stack} +\begin{itemize} +\item Grows top - down +\item Configurable stack size +\item Stack grows on demand. Access beyond current size ends up in a +''Stackfault'' which is handled by the kernel +\item ulimit -a shows the current maximum stack size +\item ulimit -s \emph{size} sets the maximum stack size +\item Default maximum stack size is 8MiB +\end{itemize} +\end{frame} + +\subsection{The heap} + +\begin{frame} +\frametitle{The heap: Userland handling} +\begin{itemize} +\item Memory is allocated using malloc() +\item Memory is freed using free() +\item malloc() uses the mmap() and the sbrk() system calls +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{The heap: Userland handling} +\begin{itemize} +\item For small junks, malloc() allocates memory from the heap and adjusts the +size using sbrk() +\item For larger blocks (larger than defined in MMAP\_THRESHOLD) the memory is +allocated as private, anonymous mapping +\item MMAP\_THRESHOLD is 128kb by default +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{malloc()} +\begin{itemize} +\item Keep over-commit in mind! +\item If over-commit is enabled: A non-null return value from malloc() doesn't +guarantee that the memory really is available. +\end{itemize} +\end{frame} + +\section{Do's and Dont's} +\subsection{The heap} +% fragmentation +% check return value +% ulimit (limit memory consumption) +\begin{frame} +\frametitle{Return value} +Always check malloc's return value!! +\end{frame} + +\begin{frame} +\frametitle{How to avoid heap fragmentation} +\begin{itemize} +\item GLIBCs malloc() itself tries to avoid fragmentation +\item The allocator can't avoid fragmentation caused by a bad application +design! +\item Try to re-use memory pools +\item free memory you don't need anymore! +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{How to limit memory consumption} +ulimit: +\begin{itemize} +\item ulimit -d sets a limit for the data segment +\item ulimit -v sets a limit for the virtual memory +\item Check limits with ulimit -a +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{ulimit example} +\scriptsize +\begin{verbatim} +$ ulimit -a +core file size (blocks, -c) 0 +data seg size (kbytes, -d) unlimited +scheduling priority (-e) 20 +file size (blocks, -f) unlimited +pending signals (-i) 16382 +max locked memory (kbytes, -l) 64 +max memory size (kbytes, -m) unlimited +open files (-n) 1024 +pipe size (512 bytes, -p) 8 +POSIX message queues (bytes, -q) 819200 +real-time priority (-r) 0 +stack size (kbytes, -s) 8192 +cpu time (seconds, -t) unlimited +max user processes (-u) unlimited +virtual memory (kbytes, -v) unlimited +file locks (-x) unlimited +\end{verbatim} +\end{frame} + +\section{Realtime} +\subsection{General} +\begin{frame}[fragile] +\frametitle{Locking the memory} +\begin{verbatim} +/* Lock memory */ +if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) { + perror("mlockall failed"); + exit(-2); +} +\end{verbatim} +\end{frame} +\subsection{Stack} +\begin{frame}[fragile] +\frametitle{Stack prefaulting} +\begin{verbatim} +#define MAX_SAFE_STACK (8*1024) + +void stack_prefault(void) { + unsigned char dummy[MAX_SAFE_STACK]; + + memset(&dummy, 0, MAX_SAFE_STACK); + return; +} +\end{verbatim} +\end{frame} + +\subsection{Heap} +\begin{frame} +\frametitle{Allocations from Realtime context} +\begin{itemize} +\item If possible, avoid memory allocations from Realtime context +\item Try to use a pre-allocated buffer +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Disable malloc trimming and mmap usage} +\begin{verbatim} +mallopt(M_TRIM_THRESHOLD, -1); +mallopt(M_MMAP_MAX, 0); +\end{verbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Reserve process memory} +\begin{verbatim} +static void reserve_process_memory(int size) +{ + int i; + char *buffer; + + buffer = malloc(size); + + /* Touch each page in this piece of + * memory to get it mapped into RAM */ + for (i = 0; i < size; i += sysconf(_SC_PAGESIZE)) + buffer[i] = 0; + + free(buffer); +} +\end{verbatim} +\end{frame} + +\section*{sources} +\begin{frame} +\frametitle{sources} +\begin{thebibliography}{1} +\bibitem{mmm} http://cftw.wordpress.com/2009/11/02/introduction-to-the-linux-memory-management/ +\bibitem{mmm} http://rt.wiki.kernel.org/ +\end{thebibliography} +\end{frame} + +\end{document} |
