Source files ------------ We build all the tools into a single virt-mem executable, in order to share the most runtime. Almost all the code between individual tools is shared anyway. lib/ - The common core of all the tools. Library, kernel symbols, command line handling, memory images, etc. lib/virt_mem.ml contains most of the important 'glue' code. uname/ dmesg/ etc. - The code specific to each tool. This is usually rather small because the code in lib/ does the hard work. mem/ - This brings everything together and links it into a single executable. Other than that purpose, there is almost nothing in this directory. General structure of lib/virt_mem.ml ------------------------------------ We start with a bare kernel memory image ('Virt_mem_types.image0') which gets successively enhanced with extra data along the way: Parse command line arguments, work out what virtual machines to process, load kernel images | | (passes a 'Virt_mem_types.image0') V Find kernel symbols | | (enhanced into a 'Virt_mem_types.image1') V Find kernel version (uname) | | (enhanced into a 'Virt_mem_types.image2') V Call tool's "run" function. Tools can register other callbacks which get called at earlier stages.