Hamish Humbert
Ham's guide to systems programming
Hamish Humbert
v0.1.1, 25 October 2026
- 1Forewordnot yet
- 2Setup and toolingnot yet
- 2.1 The beginner stack
- 2.1.1 Linux
- 2.1.2 Git
- 2.1.3 Bash
- 2.1.4 Makefiles
- 2.1 The beginner stack
- 3C, the native languagenot yet
- 3.1 Pointers
- 3.2 Memory layout
- 3.3 Dynamic allocation
- 3.4 Placeholder: Beej's Guide to C Programming
- 4Computer architecturenot yet
- 4.1 CPU execution
- 4.2 Registers
- 4.3 Cache hierarchy
- 4.4 Virtual memory and paging
- 4.5 Calling conventions
- 4.6 Assembly
- 4.7 Reading
- 4.7.1 Computer Systems: A Programmer's Perspective
- 4.7.2 Modern Operating Systems
- 5Linuxnot yet
- 5.1 Daily terminal use
- 5.2 Shell scripting
- 5.3 Processes
- 5.4 Signals
- 5.5 Pipes
- 5.6 ELF binaries
- 6POSIX system callsnot yet
- 6.1 How applications talk to the kernel
- 7Memorynot yet
- 7.1 Stack and heap
- 7.2 Fragmentation
- 7.3 The malloc family
- 7.4 Memory debugging
- 7.4.1 Valgrind
- 7.4.2 AddressSanitizer
- 7.4.3 GDB
- 8Operating system internalsnot yet
- 8.1 Process scheduling
- 8.2 Context switching
- 8.3 Virtual memory
- 8.4 File systems
- 8.5 Kernel architecture
- 8.6 Synchronization
- 8.7 Deadlocks
- 8.8 IPC
- 8.9 Threads
- 8.10 Scheduling algorithms
- 9Networkingnot yet
- 9.1 Protocols
- 9.1.1 TCP/IP
- 9.1.2 UDP
- 9.1.3 DNS
- 9.1.4 HTTP
- 9.1.5 HTTPS
- 9.2 Routing
- 9.3 Sockets
- 9.4 I/O multiplexing
- 9.5 Project: an HTTP, chat or file server
- 9.6 Placeholder: Beej's Guide to Network Programming
- 9.1 Protocols
- 10Reading production codenot yet
- 10.1 The Linux kernel
- 10.2 musl libc
- 10.3 SQLite
- 11Projectsnot yet
- 11.1 Mini shell
- 11.2 Memory allocator
- 11.3 Text editor
- 11.4 HTTP server
- 11.5 File system
- 11.6 Thread pool
- 11.7 Skip list library
- 11.8 JSON parser
- 11.9 Compiler
- 11.10 Virtual machine
- 11.11 Toy operating system
- 11.12 Custom malloc()