| |
| 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. |