summaryrefslogtreecommitdiff
path: root/Tools/WAD/HACK
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/WAD/HACK')
-rw-r--r--Tools/WAD/HACK78
1 files changed, 78 insertions, 0 deletions
diff --git a/Tools/WAD/HACK b/Tools/WAD/HACK
new file mode 100644
index 0000000..2e6d17a
--- /dev/null
+++ b/Tools/WAD/HACK
@@ -0,0 +1,78 @@
+The WAD Developers Guide
+
+David Beazley (beazley@cs.uchicago.edu)
+
+$Id: HACK 10001 2007-10-17 21:33:57Z wsfulton $
+
+1. Introduction
+
+This short document is intended for anyone who feels inclined to work
+on WAD and make improvements. It is by no means complete. However,
+it contains random commentary on the current implementation.
+
+2. A brief word on the execution environment
+
+Because WAD is embedded in the same application it is intended to
+debug, it must take an extremely conservative approach to its own
+execution environment. Specifically, it can not rely upon the correct
+operation of C library--especially with respect to memory management
+and other basic operations. Because of this, the implementation of
+WAD makes every effort to be as self-contained as possible--thus
+minimizing its exposure to corrupted libraries in the faulting
+application. Closely related to this, WAD does not rely on any
+third-party libraries (e.g., libbfd) since it is almost impossible to
+fully verify the way in which such libraries might use other programming
+libraries.
+
+With that said, you might keep the following rules in mind:
+
+ rule 1: Trust nothing--it might be broken.
+ rule 2: When in doubt, see rule 1.
+
+(Of course, we can probably get away with assuming that the OS isn't
+hosed).
+
+3. Memory management
+
+There are two problems here: first, the dynamic memory
+allocator may be corrupted or broken (e.g., as might occur when
+you double-free memory or free memory not allocated by malloc).
+Second, the WAD signal handler prefers to execute own on its own
+signal handling stack. This stack is of limited size so it is not
+a reliable place to put large amounts of data.
+
+Small buffers and scratch areas are managed through the use of static
+variables allocated in the WAD data-segment.
+
+For dynamic memory management, WAD provides its own memory allocator
+in the function wad_malloc(). This function allocates memory by using
+mmap() to grab anonymous memory regions (mapped to /dev/zero). This
+memory is currently allocated in chunks of 64Kbytes as needed.
+
+To simplify the implementation and prevent potential memory problems
+in WAD itself, WAD never releases the memory that it allocates. There
+is no wad_free() operation nor is there any way to release all of the
+memory previously allocated.
+
+Although memory is never released, WAD tries to intern commonly used
+strings. An internal string hash is built as WAD runs and in most
+cases, each string is mapped to a single instance of the string in
+this hash table. The function wad_string_lookup(char *s) is used to
+return a pointer to the string s in the hash table. If no entry
+exists, it is created and a pointer is returned.
+
+4. I/O
+
+It is probably a bad idea to use buffered I/O with WAD. This may
+result in implicit calls to malloc() and related functions.
+
+
+
+
+
+
+
+
+
+
+