The whole thing · 21 steps

One full run

Every other page takes one piece of the emulator apart. This one puts them back together: a single run, from the moment the process starts to a finished frame in the window.

The four panels stay on screen the whole way through, so you can watch cause and effect across them. Guest memory fills up on the left as things are mapped. The middle shows the mechanism currently doing work. The render target on the right stays black for two thirds of the run — because nothing can be drawn until the loading, linking and translation are all finished. Step it with Prev/Next, or click any mark on the rail to jump.

Launch to first frame

Read first: What an emulator is. Return to the learning route.

Model boundary: A stepped story with invented addresses and counts. It shows ordering, not a captured run.

  1. Predict which must happen first: reserve address space, copy segments, resolve imports, or execute the entry point.
  2. Reset, then advance through Map the segments, Resolve the NIDs and Patch the GOT. Watch the memory and state panels.
  3. Continue to the first image. Explain why mapped code and a running guest do not yet imply a completed frame.
Check your explanation

Reservation creates an address range; mapping supplies bytes and permissions. Import resolution finds targets, and relocation writes the appropriate slots. A visible frame also needs guest GPU work, host preparation, submission and completion. This selected story is not a claim that every title follows identical startup timing.

What to notice

Three things worth watching

The screen stays black for a long time

Fifteen of the twenty-one steps happen before a single pixel exists. That ratio is the honest shape of the project: loading, linking, patching and translating are the work, and drawing is what happens once they have all succeeded. When a title shows you nothing but a black window, it has usually failed somewhere in the first two thirds of this run.

Memory is claimed before it is needed

Step 2 reserves the guest's whole address range while there is still nothing to put in it. That looks wasteful until step 13, when the game demands a specific address and gets it. A game stores raw pointers and hands them to the GPU; there is no opportunity to relocate anything afterwards, so the space has to be owned in advance.

Every boundary crossing costs something

Watch the phase badge. Load and Link are one-time costs paid at startup. Draw is paid every frame — and inside it, the pipeline compile at step 17 and the page-fault upload at step 19 are the two that show up as stutter. Both are caching problems, which is why so much of the recent work in the tree is about cache keys and dirty-page granularity.

Where to go from here

Each step here has a topic that covers it properly: ELF and SELF for steps 3–4, NIDs and the runtime linker for 7–9, the ABI wall for step 11, PM4 and the command processor for 14–15, shaders for 16, and coherency for 19.