WINSUP ROADMAP The purpose of this document is to give the briefest overview of how the various parts of cygwin work together and where everything can be found. The intended audience is people developing the cygwin dll itself. Comments to dj@cygnus.com. === cygwin1.dll source files - overhead .h winsup autoload debug external shared sync .cc assert dcrt0 debug external init ntea registry security shared smallprint strace sync .din cygwin .rc winver .sgml external shared - processes .h sigproc .cc exec fork pinfo resource signal sigproc spawn wait - signals .cc exceptions window - files and I/O .h delqueue fhandler path select .cc delqueue dir fhandler* dtable path pipe select tty .sgml dtable path - common unix functions .h dll_init tz_posixrules .cc dlfcn dll_init environ errno fcntl flog grp ioctl localtime malloc passwd scandir strsep syscalls sysconf syslog termios .c longjmp setjmp .sgml dll_init - unix emulation .cc heap mmap net times unifo uname --- if MT_SAFE .h thread .cc pthread thread --- from other places regex/* ../libiberty/{random,strsignal} ../newlib/* (libc) === libcygwin.a source files libccrt0.cc libcmain.cc dll_entry.cc dll_main.cc getopt.c === gmon (profiling, -pg) gcrt0.c gmon.c gmon.h mcount.c profil.c profil.h === entry points - normal cygwin program newlib/libc/sys/cygwin/crt0.c has mainCRTStartup() and calls cygwin_crt0() libccrt0.cc has cygwin_crt0() and calls dll_crt0() dcrt0.cc - has dll_crt0() Note: dll_init.cc has nothing to do with initializing the cygwin dll. It initializes the dlls you have dl_open'd. - cygwin-built dll dll_entry.cc - has a macro for wrapping your dll startup function (equivalent of DllMain()) in such a way that you get your cygwin environment set up automatically when your dll is loaded. dll_main.cc - has empty DllMain() in case you don't have your own - manually loading cygwin1.dll init.cc - has dll_entry() which is called by the OS when the dll is loaded. It doesn't do much except note if you linked cygwin1.dll or are manually loading it. === About "fhandlers" An fhandler is a file type handler. This is where the unix device emulation happens. dtable.cc maps posix file descriptors to a table of file handlers (type fhandler) in the dll. It's mostly concerned with managing the table of descriptors (open, dup, fork, select). Most of the posix I/O system calls (syscalls.cc) use the fdtab table to call the right fhandler directly. fhandler.cc is the base class; specific types are derived as appropriate (see fhandler.h). dtable.cc is in charge of selecting and creating a suitable fhandler when you open a file. path.cc handles emulated files in /dev (like /dev/null) by returning an FH_* value from get_device_number (which dtable.cc calls in dtable::build_fhandler). Note: if you're looking for read() and write(), they call _read() and _write() in syscalls.cc. The non-underscored ones are in newlib/libc/syscalls and just call the underscored ones. === How "fork" works It all starts in fork() in fork.cc. Set up a pid in the shared memory area for the new child. Use setjmp() to capture state. First time (parent), set up some stuff and use CreateProcess to run a second copy of the same executable. The second copy will note in the shared memory area that it's a fork, and do the longjmp. They sync up and the parent copies all it's program memory to the child's address space. There's also code to reload dlls, map shared memory and mmap'd files, etc. Handling the special startup for the child is done in dcrt0.cc in many places. This case is triggered by a special StartupInfo structure that's passed from the parent to the child in CreateProcessA.