130 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
 | 
						|
			    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* hinfo path pipe select tty
 | 
						|
.sgml	hinfo 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.
 | 
						|
 | 
						|
hinfo.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 hinfo table to call the right
 | 
						|
fhandler directly.
 | 
						|
 | 
						|
fhandler.cc is the base class; specific types are derived as
 | 
						|
appropriate (see fhandler.h).  hinfo.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 hinfo.cc calls in hinfo::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.
 |