Learning path

The collection in three orders. Each route is a sequence, not a tier: every step says why it sits where it does and which courses declare it a prerequisite. Walk them in order — the second assumes the first, the third assumes both.

The orders come from two places, not from taste. The chain itself is the one docs/course-mission.md states the collection exists to serve. The order inside it is the order the dependencies field of each course's manifest.json admits — checked against the real manifests on every render, and the count is printed at the bottom of this page.

Formats: what a binary is

One question, asked seven times.

Start with one container you can read end to end with nothing but xxd. Then read the others as answers to the same questions, because the differences are the evidence that these fields are answers and not laws. Finish with the two formats that are verified rather than loaded, and with the one that makes a loaded executable debuggable.

  1. The only course here with no prerequisites, and the one the other six are written against. Nothing else in the collection declares it a dependency as often as it does.

    8 modules24 concepts408 minintermediatedependency graph
    declared prerequisitesnone — nothing in the collection declares this one as a dependency
  2. Mach-O answers the header, segment, symbol and relocation questions ELF just answered. Its load commands, __LINKEDIT and chained fixups are the clearest proof that these fields are one platform's answers rather than the answers.

    8 modules24 concepts400 minintermediatedependency graph
    declared prerequisiteself
  3. PE answers them a third time, with a DOS stub, sixteen data directories and an RVA model. Having read ELF and Mach-O, the DOS stub reads as an accident rather than a mystery.

    8 modules24 concepts360 minintermediatedependency graph
    declared prerequisiteself
  4. The object-file layer all three share: PE is built out of COFF, and so is the classic Mach-O object file. It sits after the two of them and before the formats that are only a container.

    5 modules18 concepts334 minintermediatedependency graph
    declared prerequisitespe
  5. A format with no operating system in it. The class file is verified, not loaded, and after ELF, PE and Mach-O that trade is legible as a container giving up the loader's job to a verifier.

    5 modules18 concepts369 minintermediatedependency graph
    declared prerequisiteselfcoff
  6. Almost every number in the file is one variable-width encoding, and the core specification deliberately does not define an object file. It is the format where the compiler/runtime boundary is being renegotiated in public.

    5 modules13 concepts274 minintermediatedependency graph
    declared prerequisiteselfcoff
  7. The format that travels beside an executable instead of being one, and the only reason a stack trace can name a line. Last because it is what you read once everything else is already in place.

    5 modules23 concepts450 minintermediatedependency graph
    declared prerequisiteself

Every architecture, then the backend

x86-64, then AArch64, then RISC-V, then IR to all three.

Twelve courses that pay the exhaustive per-architecture reference the mission asks for, then the backend that has to emit any of them. The order inside each architecture is fixed by its own prerequisites; the order between the three is a choice, and it is made here so that each one can be read as a contrast against the one before it.

  1. The instruction surface and the encoding behind it. Declares isa, exe, priv, simd and smp -- all of Route 2 -- and is the reference the other two architectures are measured against.

    2 modules5 concepts127 minadvanceddependency graph
    declared prerequisitesisaexeprivsimdsmp
  2. The calling convention: why the fourth argument of a call is in rcx and the fourth argument of a syscall is in r10, which is a difference of one instruction.

    2 modules6 concepts150 minadvanceddependency graph
    declared prerequisitesx86asmisaexesecdynsimd
  3. The privileged side as an inventory: every instruction a ring-3 process can try, and the signal it dies from. The set is not the one in the manual.

    3 modules9 concepts231 minadvanceddependency graph
    declared prerequisitesx86asmx86abiisaexememprivsmpsimd
  4. SSE, AVX and AVX-512, then the instructions that imply LOCK without saying so. Declares x86asm, x86abi, smp, simd and mem -- the last data-path course for this architecture.

    2 modules6 concepts154 minadvanceddependency graph
    declared prerequisitesx86asmx86abiisasmpsimdmem
  5. AArch64 encoding from the ground up: fixed 32-bit, a four-bit class field, and a logical-immediate encoding that reaches 1,302 of 4,294,967,296 constants.

    2 modules5 concepts127 minadvanceddependency graph
    declared prerequisiteself
  6. AAPCS64. The no-flags-register contrast with x86-64 is the reason this is worth reading after x86abi rather than instead of it: one machine needs csel, another does not have a condition to select.

    2 modules5 concepts125 minadvanceddependency graph
    declared prerequisitesa64asm
  7. Modes, exceptions, interrupts, virtual memory and page tables -- six concepts in two modules, the AArch64 half of what x86sys did for x86-64.

    2 modules6 concepts150 minadvanceddependency graph
    declared prerequisitesa64abi
  8. NEON, atomics and memory ordering, where one bit carries two meanings depending on which register it is in. Completes the AArch64 half.

    2 modules5 concepts127 minadvanceddependency graph
    declared prerequisitesa64sys
  9. The encoding spectrum: 16 or 32 bits, decided by two bits that are also the two bits saying 'this is a 32-bit instruction', and a second three-bit register encoding in the compressed extension.

    2 modules5 concepts127 minadvanceddependency graph
    declared prerequisiteself
  10. The calling convention, and the register that isn't there: no flags register and no condition codes anywhere in the base ISA.

    2 modules4 concepts101 minadvanceddependency graph
    declared prerequisiteselfrvasm
  11. The privileged architecture as a document. Declares rvasm, rvabi and obj, and reads the privileged specification the way a compiler author has to read it: encodings, field widths, and the records a page-table walk emits.

    2 modules4 concepts101 minadvanceddependency graph
    declared prerequisiteselfrvasmrvabiobj
  12. Atomics, fences and the vector extension. Declares all three data-path courses and both privileged predecessors, which is why it closes the RISC-V half rather than coming earlier in it.

    2 modules4 concepts101 minadvanceddependency graph
  13. IR to machine code: instruction selection, register allocation, scheduling, and the ABI contract, across all three targets. Declares elf, obj, reloc, link and six of the twelve courses above.

    3 modules6 concepts150 minadvanceddependency graph

107 of 107 declared prerequisites are satisfied by this order.

All 33 courses named by the three routes exist on disk.

Outside the three routes

1 of the 34 courses sits outside all three routes: it has no prerequisites, nothing declares it a dependency, and it is not part of the linking chain or either architecture half. It is listed here rather than left out, because an index that silently drops 69 concepts reads as a bug — and this one is. Its full card is in the catalogue below.

HAT — Higher Education Aptitude Test6 modules69 concepts1141 minbeginner

Not sure where to start?

Browse all courses

If you know which lesson you want rather than which course, search for it directly — 398 concepts is too many to browse but not to search.

Search all concepts →