xv6-riscv Reading Order

Use separate reading tracks. Do not mix kernel files, user programs, and mkfs into one giant list.

The clean mental model is:

Makefile

kernel/ builds the OS kernel

user/ builds xv6 user programs

mkfs/ builds fs.img using those user programs

QEMU boots kernel + fs.img

1. Start with the build pipeline

Read this first to understand how everything connects.

OrderFileKindPurpose
1MakefileBuild fileBuilds kernel, user programs, mkfs, fs.img, and runs QEMU.

2. Kernel reading order

These files explain how the xv6 kernel itself works.

Kernel reading order with generated object files

These are the kernel source files and the object files they generate for the Makefile OBJS list.

OrderFileGenerated objectKindPurpose
1kernel/types.hHeaderBasic integer/type aliases.
2kernel/param.hHeaderKernel-wide size limits.
3kernel/memlayout.hHeaderPhysical/virtual memory map.
4kernel/riscv.hHeaderRISC-V registers, paging, interrupt helpers.
5kernel/defs.hHeaderCross-file kernel declarations.
6kernel/kernel.ldLinker scriptKernel memory layout at link time.
7kernel/entry.Skernel/entry.oAssemblyFirst code after QEMU jump.
8kernel/start.ckernel/start.oCEarly CPU setup before main.
9kernel/main.ckernel/main.oCKernel initialization order.
10kernel/spinlock.hHeaderSpinlock structure.
11kernel/spinlock.ckernel/spinlock.oCShort critical-section locking.
12kernel/printf.ckernel/printf.oCKernel printing and panic.
13kernel/string.ckernel/string.oCBasic memory/string helpers.
14kernel/kalloc.ckernel/kalloc.oCPhysical page allocator.
15kernel/vm.hHeadersbrk allocation mode constants.
16kernel/vm.ckernel/vm.oCPage tables and virtual memory.
17kernel/proc.hHeaderProcess, CPU, trapframe structures.
18kernel/proc.ckernel/proc.oCProcesses, scheduling, sleep/wakeup.
19kernel/swtch.Skernel/swtch.oAssemblyLow-level context switch.
20kernel/trampoline.Skernel/trampoline.oAssemblyUser/kernel trap transition code.
21kernel/kernelvec.Skernel/kernelvec.oAssemblyKernel-mode trap vector.
22kernel/trap.ckernel/trap.oCTrap, syscall, interrupt handling.
23kernel/syscall.hHeaderSyscall number definitions.
24kernel/syscall.ckernel/syscall.oCSyscall dispatch and argument fetching.
25kernel/sysproc.ckernel/sysproc.oCProcess-related syscalls.
26kernel/uart.ckernel/uart.oCLow-level serial device driver.
27kernel/console.ckernel/console.oCConsole input/output layer.
28kernel/plic.ckernel/plic.oCExternal interrupt controller.
29kernel/virtio.hHeaderVirtio disk protocol definitions.
30kernel/virtio_disk.ckernel/virtio_disk.oCVirtual disk driver.
31kernel/buf.hHeaderDisk buffer structure.
32kernel/bio.ckernel/bio.oCBuffer cache and LRU block reuse.
33kernel/fs.hHeaderOn-disk filesystem format.
34kernel/sleeplock.hHeaderSleeping lock structure.
35kernel/sleeplock.ckernel/sleeplock.oCLocks that sleep while waiting.
36kernel/file.hHeaderIn-memory file/inode/device structs.
37kernel/fs.ckernel/fs.oCInodes, directories, path lookup.
38kernel/log.ckernel/log.oCFilesystem transaction log.
39kernel/file.ckernel/file.oCOpen-file table and file operations.
40kernel/fcntl.hHeaderFile open flags.
41kernel/stat.hHeaderFile metadata structure.
42kernel/sysfile.ckernel/sysfile.oCFile-related syscalls.
43kernel/pipe.ckernel/pipe.oCPipes for process communication.
44kernel/elf.hHeaderELF executable file format.
45kernel/exec.ckernel/exec.oCLoad and run user programs.
OrderFileKindPurpose
1kernel/types.hHeaderBasic integer/type aliases.
2kernel/param.hHeaderKernel-wide size limits.
3kernel/memlayout.hHeaderPhysical/virtual memory map.
4kernel/riscv.hHeaderRISC-V registers, paging, interrupt helpers.
5kernel/defs.hHeaderCross-file kernel declarations.
6kernel/kernel.ldLinker scriptKernel memory layout at link time.
7kernel/entry.SAssemblyFirst code after QEMU jump.
8kernel/start.cCEarly CPU setup before main.
9kernel/main.cCKernel initialization order.
10kernel/spinlock.hHeaderSpinlock structure.
11kernel/spinlock.cCShort critical-section locking.
12kernel/printf.cCKernel printing and panic.
13kernel/string.cCBasic memory/string helpers.
14kernel/kalloc.cCPhysical page allocator.
15kernel/vm.hHeadersbrk allocation mode constants.
16kernel/vm.cCPage tables and virtual memory.
17kernel/proc.hHeaderProcess, CPU, trapframe structures.
18kernel/proc.cCProcesses, scheduling, sleep/wakeup.
19kernel/swtch.SAssemblyLow-level context switch.
20kernel/trampoline.SAssemblyUser/kernel trap transition code.
21kernel/kernelvec.SAssemblyKernel-mode trap vector.
22kernel/trap.cCTrap, syscall, interrupt handling.
23kernel/syscall.hHeaderSyscall number definitions.
24kernel/syscall.cCSyscall dispatch and argument fetching.
25kernel/sysproc.cCProcess-related syscalls.
26kernel/uart.cCLow-level serial device driver.
27kernel/console.cCConsole input/output layer.
28kernel/plic.cCExternal interrupt controller.
29kernel/virtio.hHeaderVirtio disk protocol definitions.
30kernel/virtio_disk.cCVirtual disk driver.
31kernel/buf.hHeaderDisk buffer structure.
32kernel/bio.cCBuffer cache and LRU block reuse.
33kernel/fs.hHeaderOn-disk filesystem format.
34kernel/sleeplock.hHeaderSleeping lock structure.
35kernel/sleeplock.cCLocks that sleep while waiting.
36kernel/file.hHeaderIn-memory file/inode/device structs.
37kernel/fs.cCInodes, directories, path lookup.
38kernel/log.cCFilesystem transaction log.
39kernel/file.cCOpen-file table and file operations.
40kernel/fcntl.hHeaderFile open flags.
41kernel/stat.hHeaderFile metadata structure.
42kernel/sysfile.cCFile-related syscalls.
43kernel/pipe.cCPipes for process communication.
44kernel/elf.hHeaderELF executable file format.
45kernel/exec.cCLoad and run user programs.

3. User-space support reading order

These files are not the kernel. They are the tiny user-space runtime that xv6 programs use.

OrderFileKindPurpose
1user/user.hHeaderUser-visible syscall and library declarations.
2user/usys.plGeneratorGenerates user syscall stubs.
3user/usys.SGenerated assemblyUser-side syscall wrappers using ecall.
4user/ulib.cUser libraryBasic user-space helper functions.
5user/printf.cUser libraryUser-space formatted printing.
6user/umalloc.cUser librarySimple user-space memory allocator.

Syscall path:

user program

user/usys.S

ecall

kernel/trampoline.S

kernel/trap.c

kernel/syscall.c

kernel/sysproc.c or kernel/sysfile.c

4. User program reading order

These are actual programs that run inside xv6.

OrderFileKindPurpose
1user/init.cUser programFirst user process.
2user/sh.cUser programxv6 shell.
3user/ls.cUser programList directory contents.
4user/cat.cUser programPrint file contents.
5user/echo.cUser programPrint arguments.
6user/grep.cUser programSearch text.
7user/wc.cUser programCount lines, words, bytes.
8user/mkdir.cUser programCreate directories.
9user/rm.cUser programRemove files.
10user/ln.cUser programCreate hard links.
11user/kill.cUser programKill a process.
12user/stressfs.cTest programStress filesystem behavior.
13user/forktest.cTest programStress process creation.
14user/grind.cTest programStress processes/filesystem/concurrency.
15user/usertests.cTest programBroad xv6 test suite.

Minimum useful order:

user/init.c

user/sh.c

user/ls.c

user/cat.c

5. mkfs and filesystem image creation

mkfs is not kernel code and not an xv6 user program.

It is a host-side tool that runs on your laptop before xv6 boots.

OrderFile / ArtifactKindPurpose
1kernel/fs.hShared format headerDefines xv6 on-disk filesystem layout.
2mkfs/mkfs.cHost toolCreates fs.img using xv6 filesystem format.
3user/_init, user/_sh, etc.RISC-V binariesCompiled user programs inserted into fs.img.
4fs.imgDisk imageVirtual disk passed to xv6 by QEMU.

Important distinction:

mkfs/mkfs.c      → compiled for the host machine
user programs    → compiled for RISC-V
fs.img           → raw disk image in xv6 filesystem format

Build flow:

user/init.c

user/_init
 
user/sh.c

user/_sh
 
mkfs/mkfs.c

mkfs/mkfs
 
mkfs/mkfs README user/_init user/_sh ...

fs.img

6. Full build-to-boot pipeline

OrderStepRuns where?Purpose
1MakefileHostCoordinates the build.
2Build kernel filesHost cross-compilerProduces kernel/kernel.
3Build user support filesHost cross-compilerProduces user runtime objects.
4Build user programsHost cross-compilerProduces user/_init, user/_sh, etc.
5Build mkfs/mkfs.cHost compilerProduces host executable mkfs/mkfs.
6Run mkfs/mkfsHostPacks user binaries into fs.img.
7Start QEMUHostCreates virtual RISC-V machine.
8Run kernel/kernelQEMU/RISC-VBoots xv6 kernel.
9Run /initxv6 user modeStarts first user process.
10Run /shxv6 user modeStarts shell.

Runtime flow:

QEMU

kernel/entry.S

kernel/start.c

kernel/main.c

disk + filesystem init

kernel/exec.c loads /init

user/init.c starts /sh

user/sh.c runs commands

7. Mental grouping

GroupFiles
Build systemMakefile
Kernelkernel/*
User runtimeuser/user.h, user/usys.pl, user/usys.S, user/ulib.c, user/printf.c, user/umalloc.c
User programsuser/init.c, user/sh.c, user/ls.c, user/cat.c, etc.
Filesystem image buildermkfs/mkfs.c
Disk imagefs.img

Final mental model:

kernel/ = the operating system
user/   = programs that run inside the operating system
mkfs/   = host tool that creates the xv6 disk image
fs.img  = virtual disk containing user programs
QEMU    = fake RISC-V machine that runs xv6