diff options
Diffstat (limited to 'docs')
-rw-r--r-- | docs/busybox.net/programming.html | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/docs/busybox.net/programming.html b/docs/busybox.net/programming.html index 1214e70f7..f54f018ed 100644 --- a/docs/busybox.net/programming.html +++ b/docs/busybox.net/programming.html @@ -259,15 +259,15 @@ before freeing them.</p> <p>With a very primitive MMU (using a base pointer plus length instead of page tables, which can provide virtual addresses and protect processes from each other, but no copy on write) you can still implement fork. But it's -unreasonably expensive, because you have to copy all the parent process's +unreasonably expensive, because you have to copy all the parent process' memory into the new process (which could easily be several megabytes per fork). And you have to do this even though that memory gets freed again as soon as the exec happens. (This is not just slow and a waste of space but causes memory usage spikes that can easily cause the system to run out of memory.)</p> <p>Without even a primitive MMU, you have no virtual addresses. Every process -can reach out and touch any other process's memory, because all pointers are to -physical addresses with no protection. Even if you copy a process's memory to +can reach out and touch any other process' memory, because all pointers are to +physical addresses with no protection. Even if you copy a process' memory to new physical addresses, all of its pointers point to the old objects in the old process. (Searching through the new copy's memory for pointers and redirect them to the new locations is not an easy problem.)</p> @@ -307,7 +307,7 @@ failed to exec.)</p> (which presumably is much shorter than the heap), and leave the heap shared. Even with no MMU at all In practice, you've just wound up in a multi-threaded situation and you can't -do a malloc() or free() on your heap without freeing the other process's memory +do a malloc() or free() on your heap without freeing the other process' memory (and if you don't have the proper locking for being threaded, corrupting the heap if both of you try to do it at the same time and wind up stomping on each other while traversing the free memory lists). The thing about vfork is @@ -350,16 +350,16 @@ on their their sockets, now you know.)</p> <h2><a name="tips_memory">Memory used by relocatable code, PIC, and static linking.</a></h2> <p>The downside of standard dynamic linking is that it results in self-modifying -code. Although each executable's pages are mmaped() into a process's address +code. Although each executable's pages are mmaped() into a process' address space from the executable file and are thus naturally shared between processes out of the page cache, the library loader (ld-linux.so.2 or ld-uClibc.so.0) writes to these pages to supply addresses for relocatable symbols. This dirties the pages, triggering copy-on-write allocation of new memory for each -processes's dirtied pages.</p> +processes' dirtied pages.</p> <p>One solution to this is Position Independent Code (PIC), a way of linking a file so all the relocations are grouped together. This dirties fewer -pages (often just a single page) for each process's relocations. The down +pages (often just a single page) for each process' relocations. The down side is this results in larger executables, which take up more space on disk (and a correspondingly larger space in memory). But when many copies of the same program are running, PIC dynamic linking trades a larger disk footprint @@ -373,7 +373,7 @@ of a win anyway.</p> <p>You can tell the glibc linker to display debugging information about its relocations with the environment variable "LD_DEBUG". Try -"LD_DEBUG=help /bin/true" for a list of commands. Learning to interperet +"LD_DEBUG=help /bin/true" for a list of commands. Learning to interpret "LD_DEBUG=statistics cat /proc/self/statm" could be interesting.</p> <h2><a name="who">Who are the BusyBox developers?</a></h2> |