digraph matrix { graph [newrank=true, nodesep=0.3, ranksep=0.2, overlap=true, splines=false, ]; node [fixedsize=false, fontname=Ubuntu fontsize=24, height=1, shape=box, style="filled,setlinewidth(5)", width=2.2 ]; edge [arrowhead=none, arrowsize=0.5, labelfontname="Ubuntu", weight=10, style="filled,setlinewidth(5)" ]; subgraph system { node [color="#e27dd6ff"]; system_ [color="#e27dd6ff", fixedsize=true, height=0, shape=point, style=invis, shape=point ]; system [color="#e27dd6ff", URL="https://en.wikibooks.org/wiki/The_Linux_Kernel/System", fillcolor=white, fixedsize=true, height=0.6, row=func, width=2]; system -> system_ [arrowhead="", color="#e27dd6ff", row=func] SCI [color="#e27dd6ff", URL="https://en.wikibooks.org/wiki/The_Linux_Kernel/Syscalls", fillcolor="#d9e7ee", fixedsize=true, label="System calls", row=usr, shape=ellipse]; sysfs [color="#e27dd6ff", fillcolor="#b2d3e4", label="proc & sysfs\nfile systems"]; SCI -> sysfs [color="#e27dd6ff"]; DM [color="#e27dd6ff", fillcolor="#91b5c9", fixedsize=true, fontsize=20, height=0.8, label="Device\nModel", shape=octagon, width=2]; sysfs -> DM [color="#e27dd6ff"]; log_sys [color="#e27dd6ff", fillcolor="#6a9ab1", fontsize=20, label="system run,\nmodules,\ngeneric\nHW access "]; DM -> log_sys [color="#e27dd6ff"]; bus_drv [color="#e27dd6ff", fillcolor="#71809b", label="bus drivers"]; log_sys -> bus_drv [color="#e27dd6ff"]; buses [color="#e27dd6ff", fillcolor="#777777", fontcolor=white, fontsize=20, label="buses:\nPCI, USB ...", row=chip]; bus_drv -> buses [color="#e27dd6ff"]; } subgraph networking { node [color="#61c2c5"]; edge [color="#61c2c5"]; networking_ [color="#61c2c5", fixedsize=true, height=0, shape=point, style=invis, shape=point width=0]; networking [color="#61c2c5", URL="https://en.wikibooks.org/wiki/The_Linux_Kernel/Networking", fillcolor=white, fixedsize=true, height=0.6, row=func, width=2]; networking -> networking_ [arrowhead="", color="#61c2c5", row=func]; sock [color="#61c2c5", fillcolor="#d9e7ee", fixedsize=true, label=Sockets, row=usr, shape=ellipse]; prot_fam [color="#61c2c5", fillcolor="#b2d3e4", label="protocol\nfamilies"]; sock -> prot_fam [color="#61c2c5"]; log_prot [color="#61c2c5", fillcolor="#6a9ab1", label="protocols:\nTCP, UDP, IP"]; prot_fam -> log_prot [color="#61c2c5"]; netif [color="#61c2c5", fillcolor="#71809b", fontsize=20, label="network\ninterfaces\nand drivers"]; log_prot -> netif [color="#61c2c5"]; net_hw [color="#61c2c5", fillcolor="#777777", fontcolor=white, fontsize=20, label="network:\nEthernet, WiFi ...", row=chip]; netif -> net_hw [color="#61c2c5"]; NFS [color="#8383cc", fillcolor="#91b5c9", fixedsize=true, height=0.8, label=NFS, shape=octagon, width=1.2]; NFS -> log_prot [color="#61c2c5", weight=0]; } subgraph storage { node [color="#8383cc"]; edge [color="#8383cc"]; NFS; storage_ [color="#8383cc", shape=point fixedsize=true, height=0, style=invis, width=0]; storage [color="#8383cc", URL="https://en.wikibooks.org/wiki/The_Linux_Kernel/Storage", fillcolor=white, fixedsize=true, height=0.6, row=func, width=2]; storage -> storage_ [arrowhead="", color="#8383cc", row=func]; FS [color="#8383cc", fillcolor="#d9e7ee", fixedsize=true, label="files and\ndirectories", row=usr, shape=ellipse]; VFS [color="#8383cc", fillcolor="#b2d3e4", label="Virtual\nFile System"]; FS -> VFS [color="#8383cc"]; VFS -> NFS [color="#8383cc", weight=0]; logFS [color="#8383cc", fillcolor="#6a9ab1", fontsize=20, label="logical\nfilesystems:\next3, xfs ..."]; VFS -> logFS [color="#8383cc"]; PC [color="#51bf5b", fillcolor="#91b5c9", fixedsize=true, fontsize=20, height=0.8, label="page\ncache", shape=octagon, width=1.2]; PC -> PA [color="#51bf5b", weight=0]; VFS -> PC [color="#8383cc", weight=0]; mmap [color="#51bf5b", fillcolor="#91b5c9", fixedsize=true, fontsize=20, height=0.8, label="memory\nmapping", shape=octagon, width=2]; VFS -> mmap [color="#8383cc", weight=0]; block [color="#8383cc", fillcolor="#71809b", fontsize=20, label="Block\ndevices\nand drivers"]; logFS -> block [color="#8383cc"]; SD [color="#8383cc", fillcolor="#777777", fontcolor=white, fontsize=20, label="storage devices:\nSCSI, NVMe ...", row=chip]; block -> SD [color="#8383cc"]; } // storge subgraph processing { node [color="#c46747"]; edge [color="#c46747"]; processing_ [color="#c46747", fixedsize=true, height=0, shape=point style=invis, width=0]; processing [color="#c46747", URL="https://en.wikibooks.org/wiki/The_Linux_Kernel/Processing", fillcolor=white, fixedsize=true, height=0.6, row=func, width=2]; processing -> processing_ [arrowhead="", color="#c46747", row=func]; proc [color="#c46747", fillcolor="#d9e7ee", fixedsize=true, label=Processes, row=usr, shape=ellipse]; Tasks [color="#c46747", fillcolor="#b2d3e4"]; proc -> Tasks [color="#c46747"]; sync [color="#c46747", fillcolor="#91b5c9", fixedsize=true, fontsize=20, fontname="Ubuntu Condensed" label=synchronization, height=0.7, //width=2, shape=octagon]; Tasks -> sync [color="#c46747"]; sched [color="#c46747", fillcolor="#6a9ab1", label=Scheduler]; sync -> sched [color="#c46747"]; IRQ [color="#c46747", fillcolor="#71809b", fontsize=20, label="interrupts\ncore,\nCPU arch"]; sched -> IRQ [color="#c46747"]; CPU [color="#c46747", fillcolor="#777777", fontcolor=white, fontsize=20, row=chip]; IRQ -> CPU [color="#c46747"]; } // processing subgraph HI { node [color="#cfbf57ff", ]; edge [color="#cfbf57ff", weight=10 ]; HI_ [color="#cfbf57ff", fixedsize=true, height=0, shape=point style=invis, width=0]; HI [color="#cfbf57ff", URL="https://en.wikibooks.org/wiki/The_Linux_Kernel/Human_interfaces", fillcolor=white, fixedsize=true, fontsize=12, height=0.6, label="human\ninterface", row=func, width=2]; HI -> HI_ [arrowhead="", color="#cfbf57ff", row=func]; char [color="#cfbf57ff", fillcolor="#d9e7ee", fixedsize=true, label="char\ndevices", row=usr, shape=ellipse]; input [color="#cfbf57ff", fillcolor="#b2d3e4", label="input\nsubsystem"]; char -> input [color="#cfbf57ff"]; F7 [color="#cfbf57ff", fillcolor="#6a9ab1", label="HI class\ndrivers"]; input -> F7 [color="#cfbf57ff"]; HID [color="#cfbf57ff", fillcolor="#71809b", fontsize=20, URL="https://www.kernel.org/doc/html/latest/hid/", label="HI\nperipherals\ndrivers"]; F7 -> HID [color="#cfbf57ff" ]; display [color="#cfbf57ff", fillcolor="#777777", fontcolor=white, fontsize=19, label="keyboard, mouse,\ndisplay, audio", row=chip]; HID -> display [color="#cfbf57ff" ]; } // HI subgraph functions { graph [rank=same]; edge [style=invis, weight=1 ]; system; networking; system -> processing [weight=1]; storage -> networking [weight=1]; memory [color="#51bf5b", URL="https://en.wikibooks.org/wiki/The_Linux_Kernel/Memory", fillcolor=white, fixedsize=true, height=0.6, row=func, width=2]; memory -> storage [weight=1]; processing -> memory [weight=1]; functions_ [fixedsize=true, height=0, shape=point style=invis, width=0]; functions_ -> HI -> system [weight=1]; functions [color=gray, tooltip="Columns represent main functionalities of the kernel", URL="http://www.makelinux.net/ldd3/chp-1-sect-2.shtml", fillcolor=gray, fixedsize=true, height=0.6, row=func, style=dashed, width=1.6]; functions -> functions_ [arrowhead="", color=gray, style="", weight=""]; } subgraph interfaces { graph [rank=same]; SCI; sock; FS; proc; char; usr_ [fixedsize=true, height=0, shape=point style=invis, width=0.5]; usr [fillcolor="#d9e7eeff", fixedsize=true, label="user space\ninterfaces", row=usr, shape=ellipse, style="filled,setlinewidth(0)"]; MA [color="#51bf5b", fillcolor="#d9e7ee", fixedsize=true, label="memory\naccess", row=usr, shape=ellipse]; } { edge [style=invis weight=10 ]; system_; SCI; system_ -> SCI; networking_; sock; networking_ -> sock; storage_; FS; storage_ -> FS; processing_; proc; processing_ -> proc; HI_; char; HI_ -> char; MA; memory_ [fixedsize=true, height=0, shape=point, style=invis, width=0]; memory_ -> MA; } subgraph virtual { graph [rank=same]; sysfs; prot_fam; VFS; Tasks; input; D0 [fixedsize=true, height=0, shape=point, style=invis, width=0]; virt [fillcolor="#b2d3e4", label="virtual\nsubsystems", URL="https://en.wikipedia.org/wiki/Proxy_pattern", tooltip="proxy between standard user space interfaces and internal implementations", style="filled,setlinewidth(0)"]; VM [color="#51bf5b", fillcolor="#b2d3e4", label="Virtual\nmemory"]; } subgraph bridges { graph [rank=same]; bridges [fillcolor="#91b5c9", shape=octagon, tooltip="bridges between uniform virtual interfaces and various implementations", URL="https://en.wikipedia.org/wiki/Bridge_pattern", style="filled,setlinewidth(0)"]; DM; NFS; mmap; sync; E0 [fixedsize=true, height=0, shape=point, style=invis, width=0]; } subgraph logical { graph [rank=same]; log_sys; log_prot; logFS; sched; F7; F0 [fixedsize=true, height=0, shape=point, style=invis, width=0]; logical [fillcolor="#6a9ab1", style="filled,setlinewidth(0)"]; log_mem [color="#51bf5b", fillcolor="#6a9ab1", label="logical\nmemory"]; } subgraph HWI { graph [rank=same]; HWI [fillcolor="#71809b", label="hardware\ninterfaces", style="filled,setlinewidth(0)"]; bus_drv; netif; block; PA; IRQ; HID; G0 [fixedsize=true, height=0, shape=point, style=invis, width=0]; } subgraph HW { graph [rank=same]; HW [fillcolor="#777777", fontcolor=white, label="electronics,\nhardware", row=chip, style="filled,setlinewidth(0)"]; buses; net_hw; SD; CPU; display; H0 [fixedsize=true, height=0, shape=point, style=invis, width=0]; RAM [color="#51bf5b", fillcolor="#777777", fontcolor=white, fontsize=20, label="MMU, RAM", row=chip]; } subgraph mem { node [color="#51bf5b", height=0.5 ]; edge [color="#51bf5b"]; PA [color="#51bf5b", fillcolor="#71809b", label="Page\nAllocator"]; mmap -> log_mem [color="#51bf5b"]; log_mem -> PA [color="#51bf5b"]; //VFS -> SW [ style=invis]; SW [color="#8383cc", fillcolor="#91b5c9", fixedsize=true, label=Swap, height=0.8, shape=octagon, width=1.2]; mmap -> SW [color="#51bf5b", weight=1]; SW -> block [color="#8383cc", weight=1]; log_mem; PA -> RAM [color="#51bf5b"]; memory -> memory_ [arrowhead="", color="#51bf5b", row=func]; MA -> VM [color="#51bf5b"]; VM -> mmap [color="#51bf5b"]; } bottom [label="© 2007-2021 Constantine Shulyupin http://www.MakeLinux.net/kernel/diagram", shape=plaintext, style=""]; CPU -> bottom [style=invis]; layers [fillcolor=lightgray, tooltip="Functionalities are divided to common layers. It is approximate division.", height=0.1, style="filled,setlinewidth(0)", width=0.5]; functions -> layers [ style=invis ]; usr -> usr_ [arrowhead="", color="#d9e7eeff", minlen=2]; usr -> virt [color="#d9e7eeff"]; virt -> D0 [arrowhead="", color="#b2d3e4", minlen=2]; virt -> bridges [color="#b2d3e4"]; bridges -> E0 [arrowhead="", color="#91b5c9", minlen=2, style="filled,setlinewidth(6)", weight=""]; bridges -> logical [color="#91b5c9", style="filled,setlinewidth(6)"]; logical -> F0 [arrowhead="", color="#6a9ab1", minlen=2, row=logical, style="filled,setlinewidth(6)", weight=""]; logical -> HWI [color="#6a9ab1", row=logical, style="filled,setlinewidth(6)"]; HWI -> G0 [arrowhead="", color="#71809b", minlen=2, row=HWI, style="filled,setlinewidth(6)", weight=""]; HWI -> HW [color="#71809b", row=HWI, style="filled,setlinewidth(6)"]; HW -> H0 [arrowhead="", color="#777777", minlen=2, row=chip, style="filled,setlinewidth(6)", weight=""]; layers -> usr [arrowhead="", color=gray, style="filled,setlinewidth(1)"]; LKD [fontsize=40, label="Linux kernel diagram", shape=plain, style=""]; LKD -> processing [style=invis]; }