\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc,trees,positioning,arrows,fit,shapes,calc}

\begin{document}
\begin{tikzpicture}
    \def\rectwidth{2}
    \def\rectheight{1}

    \draw[thick, <->] (\rectwidth / 2, -0.1) -- (\rectwidth / 2, -0.9) node[below] {\texttt{NULL}};

    % Bottom alloc
    \foreach \i in {0, ..., 0} {
        \draw (0, \i) rectangle (\rectwidth, \i + \rectheight);
        \draw[fill] (-3, \i + 0.5 * \rectheight) circle (2pt) node[left] {PFN: \i};
        \draw[thick, ->] (-0.1, \i + \rectheight * 0.5) -- +(-2.8, 0);
    }

    \draw[thick, <->] (\rectwidth / 2, \rectheight + 0.1) -- (\rectwidth / 2, \rectheight + 0.9);

    % Top alloc
    \foreach \i in {2, ..., 5} {
        % Draw 4 rectangles
        \draw (0, \i) rectangle (\rectwidth, \i + \rectheight);
        \draw[fill] (-3, \i + 0.5 * \rectheight) circle (2pt) node[left] {PFN: \i};
        \draw[thick, dotted, ->] (-0.1, \i + \rectheight * 0.5) -- +(-2.8, 0);
    }
    \draw[thick, ->] (-0.1, 2 + \rectheight * 0.5) -- +(-2.8, 0) node[below, xshift=1.5cm] {\texttt{struct page *}};

    \draw[thick, <->] (\rectwidth / 2, 6.1) -- (\rectwidth / 2, 6.9) node[above] {\texttt{NULL}};

    % Userspace
    \draw[thick] (5, 8) -- (5, -2) node[right, xshift=0.1cm, yshift=0.9cm] {Userspace};
    \draw[thick] (5 + \rectwidth, 8) -- (5 + \rectwidth, -2);
    \foreach \i in {1, ..., 3} {
        \draw (5, \i) rectangle (5 + \rectwidth, \i + \rectheight) node[right, yshift=-1cm] {\texttt{0xBEEF000\i}};
    }
    \draw[thick, ->] (2.1, 0 + \rectheight * 0.5) -- +(2.8, 1);
    \draw[thick, ->] (2.1, 2 + \rectheight * 0.5) -- +(2.8, 0);
    \draw[thick, dotted, ->] (2.1, 3 + \rectheight * 0.5) -- +(2.8, 0) node[above, xshift=-1.5cm, red] {Fault!};


\end{tikzpicture}
\end{document}