A practical guide to understanding how Linux exposes hardware to software — from PCI buses and kernel drivers to /dev, /sys, and /proc — written for developers who live in Python and want to understand what happens below the interpreter.
When you open a file in Python, you call open(). When you send a network packet, you call socket.send(). These feel like simple operations — but underneath, they cross a boundary into the Linux kernel, interact with drivers, traverse buses, and ultimately flip electrical signals on physical hardware.
This book builds a mental model of that entire journey. It starts with the Linux philosophy that “everything is a file” and progressively reveals how the kernel, buses (PCI, USB, I2C), device drivers, and virtual filesystems (/dev, /sys, /proc) work together. Each concept is illustrated with real commands you can run and Python snippets you can execute.
By the end, you will be able to navigate /sys, interpret lspci output, understand why your USB device appears at /dev/ttyUSB0, and interact with hardware directly from Python without any external library.
lspci or ls /dev and wondered what they were looking at/dev, /sys, and /proc to inspect and interact with hardwaremmap from PythonPart I — Foundation (Chapters 0–2) Establishes the Linux hardware philosophy, the kernel’s role as mediator, and the physical hardware topology including buses and device addressing.
Part II — The Driver Stack (Chapters 3–4)
Explains what device drivers do, how they load as kernel modules, and how they expose devices through the /dev filesystem.
Part III — The Virtual Filesystems (Chapters 5–6)
Deep dive into /sys and /proc — the kernel’s live interface for hardware inspection from userspace.
Part IV — Communication Mechanisms (Chapters 7–8) Covers interrupts, DMA, and memory-mapped I/O — the three fundamental ways hardware communicates with the CPU and software.
Part V — Practical Access from Python (Chapters 9–11) udev for device events, then Python patterns and end-to-end examples for real hardware interaction.
Conclusion (Chapter 12) A unified mental model tying all layers together.
All examples use Python 3.10+ and were developed on a standard x86-64 Linux system (kernel 5.x+). Commands shown are for Debian/Ubuntu-based systems; equivalent commands exist on other distributions. Code samples in code/ are self-contained and runnable. Some examples (accessing /dev/mem, raw I2C) require root privileges — this is noted where applicable.