From bf7bd4abcdd1e9ae1030c7a9dfae70c35791d771 Mon Sep 17 00:00:00 2001
From: Holger Dengler <dengler@linutronix.de>
Date: Fri, 11 Jan 2019 08:35:40 +0100
Subject: linux-basic: Add Userspace-to-Kernel API slides

Signed-off-by: Holger Dengler <dengler@linutronix.de>
---
 linux-basics/api/frm_proc.tex | 165 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 165 insertions(+)
 create mode 100644 linux-basics/api/frm_proc.tex

(limited to 'linux-basics/api/frm_proc.tex')

diff --git a/linux-basics/api/frm_proc.tex b/linux-basics/api/frm_proc.tex
new file mode 100644
index 0000000..0f51d7a
--- /dev/null
+++ b/linux-basics/api/frm_proc.tex
@@ -0,0 +1,165 @@
+\subsubsection{Pseudofs proc}
+% ----------------------------
+\begin{frame}
+\frametitle{Basics}
+\begin{itemize}
+\item most important pseudofs
+\item mount-point: /proc
+\item early mount required
+\item stable Kernel API extension
+ \begin{itemize}
+ \item process/thread information
+ \item kernel extension
+  \begin{itemize}
+  \item modules
+  \item drivers
+  \end{itemize}
+ \item system state/utilization (e.g. loadavg, interrupts)
+  \begin{itemize}
+  \item loadavg
+  \item interrupts
+  \end{itemize}
+ \item system behavior (e.g. memory over-commit)
+  \begin{itemize}
+  \item memory over-commit
+  \item network
+  \item irq affinity
+  \end{itemize}
+ \end{itemize}
+\end{itemize}
+\end{frame}
+% The pseudo filesystem proc is an important API-extension of the linux
+% kernel. It provides access to informations about the processes and
+% threads, as well as other kenel-internal information, extensions and
+% behaviour. The proc filesystem must be mounted as early as possible, right
+% after userspace gets control from kernel.
+
+% ----------------------------
+\begin{frame}
+\frametitle{Process information}
+\begin{itemize}
+\item one directory for each process
+\item PID as directory name
+\item /proc/self: link to process' own information
+\item per process:
+ \begin{itemize}
+ \item maps: memory mappings
+ \item status/stat: process status (human/machine readable)
+ \item fd/fdinfo: (open) file descriptors
+ \item map\_files: mmap-ed files
+ \item mounts: filesystem mounts
+ \item task/<tid>: information about each thread
+ \end{itemize}
+\item tools accessing process information in proc
+ \begin{itemize}
+ \item ps
+ \item top
+ \end{itemize}
+\item prevent tool output parsing
+\item direct access to process information is preferred
+\end{itemize}
+\end{frame}
+% The informations about processes are provides in separate subdirectories,
+% one for each process. The directory name is the PID number of the process.
+% The link /proc/self can be used by processes to access its own process
+% information.
+% The file "maps" shows the memory mappings of a process. It lists all
+% mappings, text segment, dynamic libraries, heap and stack.
+% The file "status" contains informations about the process status in a
+% human-readable form. The same information, but in machine readable form,
+% is in file "stat".
+% The directory "fd" and fd_info" contains information about the open file
+% handles of the process.
+% The directory "tasks" contain infomration about the threads of a process.
+
+% ----------------------------
+\begin{frame}
+\frametitle{Kernel extensions}
+\begin{itemize}
+\item system-wide information
+\item all files shows the current state of loaded extensions
+\item extensions:
+ \begin{itemize}
+ \item modules: \\ a list of loaded modules
+ \item devices: \\ major-number-to-driver mapping
+ \item filesystems: \\ all currently supported filesystems
+ \end{itemize}
+\end{itemize}
+\end{frame}
+% The kernel code can be extended by loadable modules. Ther are files in
+% /proc, which informs about the currently loaded extensions. Each time an
+% extension is added or removed, the content of these files may change.
+% The file "modules" shows all modules, which are currently loaded. It also
+% contains the start address of the text segment in memory, reference count
+% and used-by information. The tool lsmod make use of this information.
+% The file "devices" shows the mappings between the major numbers and the
+% related device driver, separate for character and block devices.
+% The file "filesystems" show all supported filesystems at the moment.
+
+% ----------------------------
+\begin{frame}
+\frametitle{System State/Utilization}
+\begin{itemize}
+\item system-wide information
+\item system state
+ \begin{itemize}
+ \item uptime: time since system start
+ \item config.gz: kernel configuration
+ \end{itemize}
+\item system utilization
+ \begin{itemize}
+ \item loadavg: average system load (with some history)
+ \item interrupts: histogram of all interrupts (total and per CPU)
+ \item meminfo: memory information
+ \item buddyinfo: information about contiguous free pages
+ \end{itemize}
+\end{itemize}
+\end{frame}
+% The system state and utilization is also available via filehandles in
+% /proc.
+% The file "loadavg" shows how many processes are schedulable at the same
+% time and the history of this value.
+% The file "interrupts" contains the histogram for all interrupts (total and
+% per CPU).
+% The file "meminfo" contains information about the system memory, the file
+% "buddyinfo" contains a list of contiguous free pages in memory zones.
+% The file "config.gz" contains the configuration, with which the kernel has
+% been build. The file is compressed an can be extracted e.g. by zcat or
+% zless.
+
+% ----------------------------
+\begin{frame}
+\frametitle{System Behavior}
+\begin{itemize}
+\item System behavior: sub-directory /proc/sys
+ \begin{itemize}
+ \item use tool \textbf{sysctl} to change the values
+ \item settings at system start: \textbf{/etc/sysctl.conf} or \textbf{/etc/sysctl.d}
+ \end{itemize}
+\item Interrupt routing: sub-directory /proc/irq
+ \begin{itemize}
+ \item system-wide affinity mask
+ \item per IRQ affinity mask
+ \item IRQs are only routed to the CPUs, which are set in the affinity mask bitfield
+ \end{itemize}
+\end{itemize}
+\end{frame}
+% The subdirectory "sys" contains a large number of file handles, which can
+% be used for fintune the system behaviour. The filehandles can be accessed
+% directly, but it is highly recommended to use the tool "sysctl" instead.
+% Most distributions supports settings at system start via /etc/sysctl.conf
+% or /etc/sysctl.d.
+% The subdirectory "irq" can be used, to configure the iterrupt routing to
+% CPUs.
+
+% ----------------------------
+\subsubsection*{}
+\begin{frame}
+\frametitle{Resources}
+\begin{itemize}
+\item \href{https://www.kernel.org/doc/Documentation/filesystems/proc.txt}{Kernel: Documentation/filesystems/proc.txt}
+\item \href{http://man7.org/linux/man-pages/man5/proc.5.html}{man 5 proc}
+\item \href{http://man7.org/linux/man-pages/man8/sysctl.8.html}{man 8 sysctl}
+\item \href{http://man7.org/linux/man-pages/man5/sysctl.conf.5.html}{man 5 sysctl.conf}
+\end{itemize} 
+\end{frame}
-- 
cgit v1.2.3

