[{"id":"a64abi","title":"The AArch64 Procedure Call Standard","version":1,"modules":2,"concepts":5,"difficulty":"advanced","importance":"critical","description":"Pass arguments and return values the way AArch64 code expects, and know the rules clang obeys that the C source never mentions, from the stack alignment to the unwind table."},{"id":"a64asm","title":"AArch64: Encoding From The Ground Up","version":1,"modules":2,"concepts":5,"difficulty":"advanced","importance":"critical","description":"Decode any AArch64 instruction from its 32 bits: the register classes, the logical-immediate encoding, the conditionals and the bit patterns that do not mean what they first look like."},{"id":"a64simd","title":"The AArch64 Data Path: NEON, Atomics and Ordering","version":1,"modules":2,"concepts":5,"difficulty":"advanced","importance":"critical","description":"Read and write AArch64 SIMD registers, express an atomic in the form the architecture defines, and put a barrier where one is actually needed rather than where habit puts it."},{"id":"a64sys","title":"The AArch64 Machine: Modes, Memory and Faults","version":1,"modules":2,"concepts":6,"difficulty":"advanced","importance":"critical","description":"Handle an exception, take a page-table walk and place the registers an interrupt saves, on the machine an embedded target actually runs on."},{"id":"coff","title":"COFF — Common Object File Format","version":1,"modules":5,"concepts":18,"difficulty":"intermediate","importance":"core","description":"Read a COFF object file: its file header, its section table, and the symbol and relocation records a linker uses to place code whose final address nobody knows yet."},{"id":"compback","title":"Compiler Backend: From IR to Machine Code","version":1,"modules":3,"concepts":6,"difficulty":"advanced","importance":"critical","description":"Read a compiler backend from front to back: instruction selection, register allocation, scheduling and encoding, and see every one of those decisions in the emitted bytes."},{"id":"dwarf","title":"DWARF — The Debugging Data Format","version":1,"modules":5,"concepts":23,"difficulty":"intermediate","importance":"core","description":"Take an address in a running program back to the file, line and local variable it came from, by reading the DWARF sections a compiler emits."},{"id":"dyn","title":"Dynamic Linking and Shared Libraries","version":1,"modules":4,"concepts":10,"difficulty":"advanced","importance":"critical","description":"Trace an undefined symbol from the first reference to the shared library that answers it: the lookup scope, .dynsym, versioning, TLS blocks and loading at run time."},{"id":"elf","title":"Executable and Linkable Format","version":1,"modules":8,"concepts":24,"difficulty":"intermediate","importance":"core","description":"Read any ELF binary end to end: headers, sections, segments, symbols, relocations, and the dynamic structures that connect it to a shared library."},{"id":"exe","title":"How a CPU Executes Instructions","version":1,"modules":3,"concepts":6,"difficulty":"advanced","importance":"critical","description":"Explain why one instruction sequence runs faster than another: dependencies, execution width, the front end, branch prediction and speculation."},{"id":"hat","title":"HAT — Higher Education Aptitude Test","version":1,"modules":6,"concepts":69,"difficulty":"beginner","importance":"core","description":"Prepare for the HEC Higher Education Aptitude Test: the paper and how it is weighted, quantitative and verbal practice, analytical reasoning, timed drills and full mocks."},{"id":"img","title":"Executable Images and OS Loading","version":1,"modules":4,"concepts":6,"difficulty":"advanced","importance":"critical","description":"Follow a program from an executable image to its first instruction: the kernel's mapping, the auxiliary vector, the initial stack and the addresses you are handed."},{"id":"isa","title":"The Instruction Set Architecture","version":1,"modules":4,"concepts":7,"difficulty":"advanced","importance":"critical","description":"Decode x86-64 from bytes yourself: the mode, the opcode map, the prefix layers, ModRM and SIB, and the length arithmetic a tool has to do with no help."},{"id":"jvm","title":"JVM Class File Format","version":1,"modules":5,"concepts":18,"difficulty":"intermediate","importance":"core","description":"Read a .class file: the magic number, the versions, the constant pool everything points into, the code a verifier checks, and the attribute that has carried every new language feature for years."},{"id":"link","title":"Static Linking and Linker Scripts","version":1,"modules":4,"concepts":10,"difficulty":"advanced","importance":"critical","description":"Follow a link from object files to a finished executable, and write the linker script that decides where every section lands and why."},{"id":"macho","title":"Mach-O Format","version":1,"modules":8,"concepts":24,"difficulty":"intermediate","importance":"core","description":"Read any Mach-O binary: headers, load commands, segments, sections, symbols, dyld, code signing, and how macOS maps an image into memory."},{"id":"mem","title":"The Memory Hierarchy","version":1,"modules":4,"concepts":8,"difficulty":"advanced","importance":"critical","description":"Predict what a memory access will cost: cache sizes and associativity, the translation path, prefetching, and the point where a huge page stops paying for itself."},{"id":"obj","title":"Object Files","version":1,"modules":5,"concepts":18,"difficulty":"intermediate","importance":"core","description":"Read the object file your compiler emits: its sections, its symbol tables, its fixup records and the holes left for a linker to fill."},{"id":"pe","title":"Portable Executable Format","version":1,"modules":8,"concepts":24,"difficulty":"intermediate","importance":"core","description":"Read any Windows PE image: the DOS and COFF headers, data directories, sections, imports, exports, base relocations, TLS and resources."},{"id":"priv","title":"Exceptions, Privilege and Mode Changes","version":1,"modules":4,"concepts":8,"difficulty":"advanced","importance":"critical","description":"Explain what happens when a program asks for something it cannot do itself: the gate tables, the ways in, and what the privilege boundary really protects."},{"id":"reloc","title":"Relocations, PIC and PIE","version":1,"modules":4,"concepts":9,"difficulty":"advanced","importance":"critical","description":"Choose the right relocation for a reference, explain what position independence actually costs, and recognise the two ways it goes wrong."},{"id":"rvabi","title":"The RISC-V ABI, and the Register That Isn't There","version":1,"modules":2,"concepts":4,"difficulty":"advanced","importance":"critical","description":"Pass arguments and results the way RISC-V code requires, and understand why the architecture needs no condition-code register at all -- and what a compiler does instead."},{"id":"rvasm","title":"RISC-V: The Encoding Spectrum","version":1,"modules":2,"concepts":5,"difficulty":"advanced","importance":"critical","description":"Decode RISC-V instructions, compressed or not, and see why one format scatters its immediates while the compressed extension adds a second register field entirely."},{"id":"rvat","title":"RISC-V Atomics and the Vector Extension","version":1,"modules":2,"concepts":4,"difficulty":"advanced","importance":"critical","description":"Write correct RISC-V atomics and memory ordering, and set up a vector whose length and element width are programmed at run time rather than fixed in the encoding."},{"id":"rvpriv","title":"The RISC-V Privileged Architecture","version":1,"modules":2,"concepts":4,"difficulty":"advanced","importance":"critical","description":"Read the RISC-V privileged specification as a compiler author: CSR encodings and their accessibility fields, the satp page-table format, and the relocation records a walk emits."},{"id":"sec","title":"Executable Security and Hardening","version":1,"modules":4,"concepts":7,"difficulty":"advanced","importance":"critical","description":"Say what each hardening flag does to the bytes it produces, and which of the three layers -- compiler, linker or driver -- is where that decision gets made."},{"id":"simd","title":"SIMD and Vector Processing","version":1,"modules":4,"concepts":7,"difficulty":"advanced","importance":"critical","description":"Decide when vectorisation pays, read a vector instruction, and use gathers, reductions and lane boundaries without a data-dependent stall."},{"id":"smp","title":"Multiprocessor Architecture","version":1,"modules":4,"concepts":7,"difficulty":"advanced","importance":"critical","description":"Reason about a program running on more than one core: topologies, true and false sharing, memory ordering, and when an atomic instruction buys anything at all."},{"id":"sym","title":"Symbol Resolution and Symbol Tables","version":1,"modules":4,"concepts":12,"difficulty":"advanced","importance":"critical","description":"Explain how a linker turns a name into an address: binding, visibility, archive extraction, versioning and the symbols the linker invents on your behalf."},{"id":"wasm","title":"WebAssembly — The Binary Format","version":1,"modules":5,"concepts":13,"difficulty":"intermediate","importance":"core","description":"Read a WebAssembly binary: its eight-byte header, its ordered sections, the variable-width LEB128 encoding almost every number uses, and the object file built on top."},{"id":"x86abi","title":"The x86-64 ABI","version":1,"modules":2,"concepts":6,"difficulty":"advanced","importance":"critical","description":"Place arguments, results and callee-saved registers the way x86-64 code requires, including why a system call moves the return address into r10 instead of rcx."},{"id":"x86asm","title":"x86-64 Assembly and Encoding","version":1,"modules":2,"concepts":5,"difficulty":"advanced","importance":"critical","description":"Write and read x86-64 assembly: the legacy, VEX and EVEX encodings, the flags, the conditionals and the addressing modes a compiler emits."},{"id":"x86simd","title":"The x86-64 Data Path: Atomics, Ordering and Vectors","version":1,"modules":2,"concepts":6,"difficulty":"advanced","importance":"critical","description":"Write correct x86-64 atomics and vector code, and know which LOCK-prefixed forms are exact, which only look it, and what alignment really costs."},{"id":"x86sys","title":"The x86-64 Machine: Privilege, Memory and Time","version":1,"modules":3,"concepts":9,"difficulty":"advanced","importance":"critical","description":"Find out what a ring-3 process can and cannot ask the CPU for, and tell a privilege check apart from a page table that will not map you."}]