• Serialize project files into structs of {path, *source, source_len} • Serialize raw file contents into array of bytes • Bonus of Compiler hints: the compiler can tell us the offsets of those JS scripts • (TODO) better usage of resource handling of the compiler
• checks for memfs in process.argv[1] • customized entrance via automatically setting process.argv[1] • e.g. process.argv[1]="/__enclose_io_memfs__/ node_modules/coffee-script/bin/coffee" • (cf. ExecuteString called on bootstrap_node.js when LoadEnvironment)
• Enforces static linking • copies routines of openssl, libuv, … into the executable image • (TODO) copy C extensions like fsevents used by the project into the executable image • problem of GLIBC and GLIBCXX
• the program is loaded into memory • your serialized project files are initially stored in .text, are then “copied” by the OS into the data segment (.data) of the program virtual address space during start-up • (cf.) text segment, the “REAL” executable instructions, read-only and has a fixed size • (TODO) read-only data segment (.rodata)
– Wikipedia: Loader (computing) “In the case of operating systems that support virtual memory, the loader may not actually copy the contents of executable files into memory, but rather may simply declare to the virtual memory subsystem that there is a mapping between a region of memory allocated to contain the running program's code and the contents of the associated executable file.”
– Wikipedia: Loader (computing) “The virtual memory subsystem is then made aware that pages with that region of memory need to be filled on demand if and when program execution actually hits those areas of unfilled memory. This may mean parts of a program's code are not actually copied into memory until they are actually used, and unused code may never be loaded into memory at all.”
• (TODO) to speed up startup, use zero-copy external string resources, V8 no longer requires that strings are aligned if they are one-byte strings (string data must be immutable and that the data must be Latin-1 and not UTF-8, which would require special treatment internally in the engine and do not allow efficient indexing)
V8 3.20.9 enforces that external pointers are aligned on a two-byte boundary (cf. Tagged pointers, objects are always at least 4-byte aligned, and we can never have a pointer to the middle of an object in JavaScript) • (TODO) maybe zero-copy buffers?
• (TODO) to speed up startup, delay String::NewExternalOneByte only when accessed, not running literally millions of String::NewFromUtf8/ String::NewExternalOneByte at start up
• fs.fstat, fs.lstat, fs.lstatSync, fs.statSync: first checks for memfs path • fs.watch, fs.watchFile: does not watch for memfs • fs.realpathSync: first checks for memfs path
Future Work • see previous TODO’s • only include JS scripts that can be referenced • only include symbols that can be referenced • generate unoptimized machine code in compile- time via v8, no sources required in runtime