This is Alan Bomberger’s reply to this note.
The first Unix Emulator was based on the BSD kernel handbook which described all the kernel functions. One had to do the right thing with respect to file handles and file table entries, directory links so that "ls" would work. Data structures were described in this book so duplicating them was straight forward and not by discovery. Sockets had to work correctly so that X-windows would work.
Usually I would run some code until a fault, and then look in the BSD book to find out what the arguments were and the expected output. It is doing this that protects against some shortcuts that lead to serious problems (such as putting the file position locator in the wrong place so that CAT of a file to itself went forever instead of merely doubling the file size).
In some cases, like sockets, whole subsystems had to be duplicated behind the system calls. This required study of the descriptions in the handbook.
The program under test served as the prioritizing function to implement the most needed functions first. Getting something simple working (like Xclock) was a great way to gain acceptance of the project.
The initial domain keeper approach required the Unix program to be relink edited because the loading and address space construction code seemed obscure (this was done on the Omron)
At Agorics I decided that I needed to support Solaris binaries so that we could run the Solaris Java JVM. I never did get their Gate calls working but I did implement a loader that copied segments from library files into the virtual copy segment that became the Unix address space. I didn't do that at Omron mostly because the Omron system was some Unix variant and I can't remember the name but it used undocumented system calls to manipulate memory. (at least I could not find the documentation).