data = open('file.txt').read()
Python f.read() └── C stdlib buffering └── read(2) syscall └── kernel VFS layer └── filesystem driver (ext4, xfs, btrfs...) └── block I/O scheduler └── NVMe driver └── NVMe controller (separate ARM/RISC-V SoC) └── Flash Translation Layer └── NAND flash cells └── DMA → system RAM
Python f.read() └── C stdlib buffering └── read(2) syscall └── kernel VFS layer └── filesystem driver (ext4, xfs, btrfs...) └── block I/O scheduler └── NVMe driver └── NVMe controller (separate ARM/RISC-V SoC) └── Flash Translation Layer └── NAND flash cells └── DMA → system RAM
Python f.read() └── C stdlib buffering └── read(2) syscall └── kernel VFS layer └── filesystem driver (ext4, xfs, btrfs...) └── block I/O scheduler └── NVMe driver └── NVMe controller (separate ARM/RISC-V SoC) └── Flash Translation Layer └── NAND flash cells └── DMA → system RAM
f = open('file.txt') # this IS a syscall — the kernel is already working
data = f.read() # and now it works harder
f = open('file.txt') # this IS a syscall — the kernel is already working
data = f.read() # and now it works harder
f = open('file.txt') # this IS a syscall — the kernel is already working
data = f.read() # and now it works harder
struct file
read(fd) → kernel VFS layer → ext4_file_read_iter() # or xfs_file_read_iter(), etc. → generic_file_read_iter() → page cache lookup
read(fd) → kernel VFS layer → ext4_file_read_iter() # or xfs_file_read_iter(), etc. → generic_file_read_iter() → page cache lookup
read(fd) → kernel VFS layer → ext4_file_read_iter() # or xfs_file_read_iter(), etc. → generic_file_read_iter() → page cache lookup
CreateFileMapping()
cat /sys/block/nvme0n1/queue/scheduler
nvme smart-log /dev/nvme0 - Your CPU — executed the syscall, set up DMA, blocked, received the interrupt, ran the completion handler, copied bytes to userspace
- The NVMe controller — ARM/RISC-V SoC inside the drive, executed the FTL lookup, sent NAND commands, supervised the DMA transfer
- The NAND flash controller — embedded within or tightly coupled to the NAND chips, handled the page read, applied ECC, transferred data to the controller's page register
- The interrupt controller (APIC) — delivered the MSI-X completion interrupt to the correct CPU core - man 2 read — The read syscall. Start here, then follow the rabbit hole.
- Linux Kernel Documentation: The Page Cache — Authoritative, dense, worth it.
- Flash Memory Guide, AnandTech — Excellent deep dive into NAND internals, written for engineers.
- nvme list / nvme smart-log /dev/nvme0 — Poke at your own NVMe controller. The SMART data it returns is illuminating.
- NVM Express Base Specification — The actual protocol spec. Freely available. Section 3 covers the submission/completion queue model.