summaryrefslogtreecommitdiffstats
path: root/presentation/images/linux_storage_stack.tex
diff options
context:
space:
mode:
Diffstat (limited to 'presentation/images/linux_storage_stack.tex')
-rw-r--r--presentation/images/linux_storage_stack.tex64
1 files changed, 64 insertions, 0 deletions
diff --git a/presentation/images/linux_storage_stack.tex b/presentation/images/linux_storage_stack.tex
new file mode 100644
index 0000000..3fb9eb2
--- /dev/null
+++ b/presentation/images/linux_storage_stack.tex
@@ -0,0 +1,64 @@
+%-------------------------------------------------------------------------------
+% linux_storage_stack.tex - renders the storage stack of the Linux kernel
+%-------------------------------------------------------------------------------
+% author : Manuel Bentele
+% date : Aug 29, 2019
+% copyright: (c) 2019 Manuel Bentele
+%-------------------------------------------------------------------------------
+
+\begin{tikzpicture}[
+ box/.style = {rectangle, draw, minimum height = 0.75cm, align = center},
+ largeb/.style = {minimum width = 0.7\textwidth},
+ smallb/.style = {minimum width = 0.225\textwidth},
+ arrow/.style = {-triangle 45},
+ desc/.style = {font = \footnotesize},
+ node distance = 0.06\textwidth
+ ]
+
+ \node[box, largeb, fill = hdr] (apps) {Applications};
+ \node[box, largeb, fill = ret, below = of apps] (vfs)
+ {Virtual file system (VFS)};
+ \node[box, smallb, fill = gray!15, left = of vfs] (dio) {Direct IO};
+ \node[box, smallb, fill = gray!15, right = of vfs] (pgc) {Page cache};
+
+ \draw[arrow] ([xshift=-0.3\textwidth]apps.south) -- node[right,desc] {read}
+ ([xshift=-0.3\textwidth]vfs.north);
+ \draw[arrow] ([xshift=-0.1\textwidth]apps.south) -- node[right,desc] {write}
+ ([xshift=-0.1\textwidth]vfs.north);
+ \draw[arrow] ([xshift=0.1\textwidth]apps.south) -- node[right,desc] {open}
+ ([xshift=0.1\textwidth]vfs.north);
+ \draw[arrow] ([xshift=0.3\textwidth]apps.south) -- node[right,desc] {\dots}
+ ([xshift=0.3\textwidth]vfs.north);
+
+ \draw[line width = 2pt] (vfs) -- (dio);
+ \draw[line width = 2pt] (vfs) -- (pgc);
+ \draw[arrow] (apps) -| node[above, align = center, desc]
+ {mmap\\malloc} (pgc);
+
+ \node[box, largeb, below = of vfs, fill = dat] (dmp)
+ {Device mapper (optional)};
+ \node[box, largeb, below = of dmp, fill = l2t] (blk)
+ {Block layer\\\scriptsize (maps BIOs to requests)};
+
+ \draw[arrow] (pgc) |- node[desc, below] {BIOs (block IOs)} (dmp);
+ \draw[arrow] (dio) |- node[desc, below] {BIOs (block IOs)} (dmp);
+ \draw[arrow] (dmp) -- node[desc, left] {BIOs} (blk);
+ \draw[arrow] ([xshift=-0.05\textwidth]dmp.north) --
+ node[desc, left, pos = 1.0] {stackable} ++(0, 0.03\textwidth) --
+ ++(0.1\textwidth, 0) -- ++(0, -0.03\textwidth);
+
+ \node[box, largeb, fill = reb, below = of blk] (drvrq)
+ {Block drivers\\\scriptsize (request based)};
+ \node[box, smallb, fill = reb, right = of drvrq] (drvbio)
+ {Block drivers\\\scriptsize (BIO based)};
+
+ \draw[arrow] (blk) -- node[desc, right] {Requests} (drvrq);
+ \draw[arrow] (dmp.south)++(0, -0.03\textwidth) -|
+ node[desc, right, pos=0.725] {BIOs} (drvbio);
+
+ \node[box, fill = gray!15, below = of drvrq.south west, anchor = north west,
+ minimum width = 0.9865\textwidth] (hw) {Physical or virtual devices};
+
+ \draw[arrow] (drvrq) -- (drvrq |- hw.north);
+ \draw[arrow] (drvbio) -- (drvbio |- hw.north);
+\end{tikzpicture} \ No newline at end of file