aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-07-17 12:36:43 +0000
committerUlrich Drepper <drepper@redhat.com>1998-07-17 12:36:43 +0000
commit07435eb48c6acb0313a8957257af4771e9e55030 (patch)
tree18150741adde33705ec19becfb988a8053cf9ca0
parentaf553418323e7afc30e5e1333d1a82592cd3888b (diff)
downloadglibc-07435eb48c6acb0313a8957257af4771e9e55030.tar.xz
glibc-07435eb48c6acb0313a8957257af4771e9e55030.zip
Update.
1998-07-17 Ulrich Drepper <drepper@cygnus.com> * debug/catchsegv.sh: Fix several stupid bugs. * shlib-versions: Define version for libSegFault. * debug/Makefile: Replace shared lib version number while rewriting. 1998-07-17 Mark Kettenis <kettenis@phys.uva.nl> * sysdeps/mach/hurd/dl-sysdep.c (__mmap): Add sanity check. Suggested by Roland McGrath. 1998-07-15 Andreas Jaeger <aj@arthur.rhein-neckar.de> * timezone/Makefile: Remove '-L (leapseconds)' for testdata generation to control environment. 1998-07-17 09:21 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h: Define SIG_HOLD. Patch by John Tobey <jtobey@banta-im.com>. * manual/llio.texi: Document readv/writev and mmap functions. Patch by Michael Deutschmann <michael@talamasca.wkpowerlink.com>. 1998-07-16 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * manual/Makefile (texis): Depend on texis.awk. (nonexamples): Filter out add-on chapters. (chapters.% top-menu.%): Depend on libc-texinfo.sh. (stamp-summary): Depend on $(texis) except summary.texi. ($(inst_infodir)/libc.info): Simplify command. * manual/libc-texinfo.sh: Cleaned up to use less temporary files. Fix the generation of the detailed node listing to make it complete again. * manual/math.texi: Fix signature of lgamma_r.
-rw-r--r--ChangeLog37
-rw-r--r--debug/Makefile3
-rwxr-xr-xdebug/catchsegv.sh16
-rw-r--r--manual/.cvsignore2
-rw-r--r--manual/Makefile35
-rw-r--r--manual/libc-texinfo.sh147
-rw-r--r--manual/llio.texi429
-rw-r--r--manual/math.texi6
-rw-r--r--manual/top-menu.texi671
-rw-r--r--shlib-versions3
-rw-r--r--sysdeps/generic/abort.c2
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.c3
-rw-r--r--sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h5
-rw-r--r--timezone/Makefile4
14 files changed, 1224 insertions, 139 deletions
diff --git a/ChangeLog b/ChangeLog
index fa257cfc07..04cb9ad3eb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+1998-07-17 Ulrich Drepper <drepper@cygnus.com>
+
+ * debug/catchsegv.sh: Fix several stupid bugs.
+
+ * shlib-versions: Define version for libSegFault.
+ * debug/Makefile: Replace shared lib version number while rewriting.
+
+1998-07-17 Mark Kettenis <kettenis@phys.uva.nl>
+
+ * sysdeps/mach/hurd/dl-sysdep.c (__mmap): Add sanity check.
+ Suggested by Roland McGrath.
+
+1998-07-15 Andreas Jaeger <aj@arthur.rhein-neckar.de>
+
+ * timezone/Makefile: Remove '-L (leapseconds)' for testdata
+ generation to control environment.
+
+1998-07-17 09:21 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h: Define SIG_HOLD.
+ Patch by John Tobey <jtobey@banta-im.com>.
+
+ * manual/llio.texi: Document readv/writev and mmap functions.
+ Patch by Michael Deutschmann <michael@talamasca.wkpowerlink.com>.
+
+1998-07-16 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * manual/Makefile (texis): Depend on texis.awk.
+ (nonexamples): Filter out add-on chapters.
+ (chapters.% top-menu.%): Depend on libc-texinfo.sh.
+ (stamp-summary): Depend on $(texis) except summary.texi.
+ ($(inst_infodir)/libc.info): Simplify command.
+ * manual/libc-texinfo.sh: Cleaned up to use less temporary files.
+ Fix the generation of the detailed node listing to make it
+ complete again.
+ * manual/math.texi: Fix signature of lgamma_r.
+
1998-07-16 23:06 Ulrich Drepper <drepper@cygnus.com>
* debug/Makefile (distribute): Add sigcontextinfo.h.
diff --git a/debug/Makefile b/debug/Makefile
index 0826b9983a..ada992eb2c 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -44,7 +44,8 @@ include ../Rules
$(objpfx)catchsegv: catchsegv.sh $(common-objpfx)soversions.mk \
$(common-objpfx)config.make
- sed 's/@VERSION@/$(version)/;s/@SLIB@/$(slibdir)/' $< > $@.new
+ sed -e 's|@VERSION@|$(version)|' -e 's|@SLIB@|$(slibdir)|' \
+ -e 's|@SOVER@|$(libSegFault.so-version)|' $< > $@.new
chmod 555 $@.new
mv -f $@.new $@
diff --git a/debug/catchsegv.sh b/debug/catchsegv.sh
index 765242ecf8..26407a7ae6 100755
--- a/debug/catchsegv.sh
+++ b/debug/catchsegv.sh
@@ -24,7 +24,7 @@ shift
args="$*"
if test $# -eq 0; then
- case "$args" in
+ case "$prog" in
--h | --he | --hel | --help)
echo 'Usage: catchsegv PROGRAM ARGS...'
echo ' --help print this help, then exit'
@@ -45,18 +45,18 @@ Written by Ulrich Drepper.'
esac
fi
-LD_PRELOAD="${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so"
+LD_PRELOAD="${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so@SOVER@"
export LD_PRELOAD
SEGFAULT_USE_ALTSTACK=1
export SEGFAULT_USE_ALTSTACK
-SEGFAULT_OUTPUT_NAME="$prog.segv.$$"
+SEGFAULT_OUTPUT_NAME="${TMPDIR:-/tmp}/`basename $prog`.segv.$$"
export SEGFAULT_OUTPUT_NAME
$prog $args
exval=$?
unset LD_PRELOAD
-# Check for an segmentation fault.
+# Check for an segmentation error.
if test $exval -eq 139; then
# We caught a segmentation error. The output is in the file with the
# name we have in SEGFAULT_OUTPUT_NAME. In the output the names of
@@ -66,10 +66,10 @@ if test $exval -eq 139; then
read line; echo "$line"
while read line; do
case "$line" in
- [*) addr="`echo $line | sed 's/^[\(.*\)]$/\1/'`"
- complete="`addr2line -f -e $prog $addr 2>/dev/null|`"
- if $? -eq 0; then
- echo "`echo $complete|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line"
+ [*) addr="`echo $line | sed 's/^\[\(.*\)\]$/\1/'`"
+ complete="`addr2line -f -e $prog $addr 2>/dev/null`"
+ if test $? -eq 0; then
+ echo "`echo $complete|sed 's/\(.*\) \(.*\)/\2(\1)/;'`$line"
else
echo "$line"
fi
diff --git a/manual/.cvsignore b/manual/.cvsignore
index 01f89684cf..1d23d99cd2 100644
--- a/manual/.cvsignore
+++ b/manual/.cvsignore
@@ -8,5 +8,5 @@ glibc-*
*.toc *.aux *.log *.tmp
*.cp *.cps *.fn *.fns *.vr *.vrs *.tp *.tps *.ky *.kys *.pg *.pgs
-chapters chapters-incl1 chapters-incl2 summary.texi stamp-*
+texis top-menu.texi chapters.texi summary.texi stamp-*
distinfo dir-add.texinfo
diff --git a/manual/Makefile b/manual/Makefile
index 8af1d6c1a2..47656c6c7f 100644
--- a/manual/Makefile
+++ b/manual/Makefile
@@ -48,35 +48,32 @@ endif
mkinstalldirs = $(..)scripts/mkinstalldirs
chapters = $(addsuffix .texi, \
- intro errno memory ctype string mbyte locale message search \
- pattern io stdio llio filesys pipe socket terminal math \
- arith time setjmp signal startup process job nss users \
- sysinfo conf)
-add-chapters = $(wildcard $(patsubst %, ../%.texi, \
- $(join $(add-ons:=/),$(add-ons))))
+ intro errno memory ctype string mbyte locale \
+ message search pattern io stdio llio filesys \
+ pipe socket terminal math arith time setjmp \
+ signal startup process job nss users sysinfo conf)
+add-chapters = $(wildcard $(foreach d, $(add-ons), ../$d/$d.texi))
appendices = lang.texi header.texi install.texi maint.texi contrib.texi
-include texis
-texis: $(chapters) $(add-chapters) $(appendices) lgpl.texinfo
- $(AWK) -f texis.awk $^ > $@.T
+texis: texis.awk $(chapters) $(add-chapters) $(appendices) lgpl.texinfo
+ $(AWK) -f $^ > $@.T
mv -f $@.T $@
-nonexamples = $(filter-out %.c.texi, $(texis))
+nonexamples = $(filter-out $(add-chapters) %.c.texi, $(texis))
examples = $(filter %.c.texi, $(texis))
# Kludge: implicit rule so Make knows the one command does it all.
-chapters.% top-menu.%: $(texis)
- AWK=$(AWK) $(SHELL) libc-texinfo.sh \
- '$(chapters)' '$(add-chapters)' '$(appendices)'
+chapters.% top-menu.%: libc-texinfo.sh $(texis)
+ AWK=$(AWK) $(SHELL) $< '$(chapters)' '$(add-chapters)' '$(appendices)'
libc.dvi libc.info: chapters.texi top-menu.texi
libc.dvi: texinfo.tex
# Generate the summary from the Texinfo source files for each chapter.
summary.texi: stamp-summary ;
-stamp-summary: summary.awk $(chapters) $(chapters-incl)
- $(AWK) -f $^ \
- | sort -df +1 -2 | tr '\014' '\012' > summary-tmp
+stamp-summary: summary.awk $(filter-out summary.texi, $(texis))
+ $(AWK) -f $^ | sort -df +1 -2 | tr '\014' '\012' > summary-tmp
$(move-if-change) summary-tmp summary.texi
touch $@
@@ -106,8 +103,8 @@ dir-add.texinfo: xtract-typefun.awk $(texis)
$(TEXI2DVI) $<
# Distribution.
-minimal-dist = summary.awk texis.awk libc-texinfo.sh libc.texinfo \
- $(filter-out summary.texi, $(nonexamples)) \
+minimal-dist = summary.awk texis.awk libc-texinfo.sh libc.texinfo \
+ $(filter-out summary.texi, $(nonexamples)) \
$(patsubst %.c.texi,examples/%.c, $(examples))
doc-only-dist = Makefile COPYING.LIB
@@ -170,9 +167,7 @@ install-%: ;
$(inst_infodir)/libc.info: libc.info installdirs
for file in $<*; do \
- name=`basename $$file`; \
- $(INSTALL_DATA) $$file \
- `echo $@ | sed "s,$<\$$,$$name,"`; \
+ $(INSTALL_DATA) $$file $(@D)/$$file; \
done
installdirs:
diff --git a/manual/libc-texinfo.sh b/manual/libc-texinfo.sh
index 88733cb079..7f26f8ec5f 100644
--- a/manual/libc-texinfo.sh
+++ b/manual/libc-texinfo.sh
@@ -2,98 +2,71 @@
# Create libc.texinfo from the chapter files.
-grep '^@node.*Top' $1 | cut -d, -f-2 |
- sed 's/, /:/; s/:@node /:/; s/ /_/g; s/:/ /g' >cnodes.$$
-
-$AWK '{ file[$2] = $1; nnode[$2] = $3 }
-END { for(x in file)
- if(file[x] != "")
- print file[x] ":" x, file[nnode[x]] ":" nnode[x] }' \
- cnodes.$$ | tsort | sed 's/_/ /g; $d' >corder.$$
-
-[ -z "$2" ] || grep '^@node.*Top' `echo $2 /dev/null | tr ' ' '\n' | sort` |
- cut -d, -f1 | sed 's/@node //' >xorder.$$
-
-grep '^@node.*Top' $3 | cut -d, -f-2 |
- sed 's/, /:/; s/:@node /:/; s/ /_/g; s/:/ /g' >anodes.$$
-
-$AWK '{ file[$2] = $1; nnode[$2] = $3 }
-END { for(x in file)
- if(file[x] != "")
- print file[x] ":" x, file[nnode[x]] ":" nnode[x] }' \
- anodes.$$ | tsort | sed 's/_/ /g; $d' >aorder.$$
-
-IFS=:
-
->incl.$$
->smenu.$$
->lmenu.$$
-
-while read file node; do
- echo "@include $file" >>incl.$$
- echo "* $node:: `sed -n 's/^@c %MENU% //p' $file`" >>smenu.$$
- lmenu=`sed -n '/^@menu/,/^@end menu/p; /^@end menu/q' $file |
- sed '/^@menu/d; /^@end menu/d'`
- [ -z "$lmenu" ] || (
- echo; echo "$node"; echo
- echo "$lmenu"
- ) >>lmenu.$$
-done <corder.$$
-
-if [ -f xorder.$$ ]; then
-
- (echo; echo 'Add-ons'; echo) >>smenu.$$
-
- while read file node; do
- echo "@include $file" >>incl.$$
- echo "* $node:: `sed -n 's/^@c %MENU% //p' $file`" >>smenu.$$
- lmenu=`sed -n '/^@menu/,/^@end menu/p; /^@end menu/q' $file |
- sed '/^@menu/d; /^@end menu/d'`
- [ -z "$lmenu" ] || (
- echo; echo "$node"; echo
- echo "$lmenu"
- ) >>lmenu.$$
- done <xorder.$$
-fi
+trap "rm -f *.$$; exit 1" 1 2 15
+
+exec 3>incl.$$ 4>smenu.$$ 5>lmenu.$$
+
+build_menu () {
+ while IFS=: read file node; do
+ echo "@include $file" >&3
+ echo "* $node:: `sed -n 's/^@c %MENU% //p' $file`" >&4
+ $AWK 'BEGIN { do_menu = 0 }
+ /^@node / { sub(/^@node /, ""); sub(/,.*$/, ""); node = $0 }
+ /^@menu/ { printf "\n%s\n\n", node; do_menu = 1; next }
+ /^@end menu/ { do_menu = 0 }
+ do_menu { print }' $file >&5
+ done
+}
-(echo; echo 'Appendices'; echo) >>smenu.$$
-
-while read file node; do
- echo "@include $file" >>incl.$$
- echo "* $node:: `sed -n 's/^@c %MENU% //p' $file`" >>smenu.$$
- lmenu=`sed -n '/^@menu/,/^@end menu/p; /^@end menu/q' $file |
- sed '/^@menu/d; /^@end menu/d'`
- [ -z "$lmenu" ] || (
- echo; echo "$node"; echo
- echo "$lmenu"
- ) >>lmenu.$$
-done <aorder.$$
-
-$AWK '
-BEGIN { FS=":" }
-
-/^\*/ {
- printf("%-32s", $1 "::");
- x = split($3, word, " ");
- hpos = 34;
- for(i = 1; i <= x; i++) {
- hpos += length(word[i]) + 1;
- if(hpos > 78) {
- printf("\n%34s", "");
- hpos = 35 + length(word[i]);
- }
- printf(" %s", word[i]);
- }
- print ".";
+collect_nodes () {
+ grep '^@node.*Top' "$@" /dev/null | cut -d, -f-2 |
+ sed 's/, /:/; s/:@node /:/; s/ /_/g; s/:/ /g' |
+ $AWK '{ file[$2] = $1; nnode[$2] = $3 }
+ END { for (x in file)
+ if (file[x] != "")
+ print file[x] ":" x, file[nnode[x]] ":" nnode[x] }' |
+ tsort | sed 's/_/ /g; $d'
}
-!/^\*/ { print; }
-' smenu.$$ >smenux.$$
+collect_nodes $1 | build_menu
+
+if [ -n "$2" ]; then
+
+ { echo; echo 'Add-ons'; echo; } >&4
+
+ grep '^@node.*Top' `echo $2 /dev/null | tr ' ' '\n' | sort` |
+ cut -d, -f1 | sed 's/@node //' | build_menu
+
+fi
+
+{ echo; echo 'Appendices'; echo; } >&4
+
+collect_nodes $3 | build_menu
+
+exec 3>&- 4>&- 5>&-
mv -f incl.$$ chapters.texi
-(echo '@menu'
- cat smenux.$$
+{
+ echo '@menu'
+ $AWK -F: '
+ /^\*/ {
+ printf("%-32s", $1 "::");
+ x = split($3, word, " ");
+ hpos = 34;
+ for (i = 1; i <= x; i++) {
+ hpos += length(word[i]) + 1;
+ if (hpos > 78) {
+ printf("\n%34s", "");
+ hpos = 35 + length(word[i]);
+ }
+ printf(" %s", word[i]);
+ }
+ print ".";
+ }
+
+ !/^\*/ { print; }
+ ' smenu.$$
cat <<EOF
* Copying:: The GNU Library General Public License says
how you can copy and share the GNU C Library.
@@ -109,7 +82,7 @@ Indices
--- The Detailed Node Listing ---
EOF
cat lmenu.$$
- echo '@end menu' ) >top-menu.texi.$$
+ echo '@end menu'; } >top-menu.texi.$$
mv -f top-menu.texi.$$ top-menu.texi
rm -f *.$$
diff --git a/manual/llio.texi b/manual/llio.texi
index 459032ee3a..cf3e1a7c89 100644
--- a/manual/llio.texi
+++ b/manual/llio.texi
@@ -41,6 +41,8 @@ directly.)
or vice-versa.
* Stream/Descriptor Precautions:: Precautions needed if you use both
descriptors and streams.
+* Scatter-Gather:: Fast I/O to discontinous buffers.
+* Memory-mapped I/O:: Using files like memory.
* Waiting for I/O:: How to check for input or output
on multiple file descriptors.
* Synchronizing I/O:: Making sure all I/O actions completed.
@@ -58,6 +60,7 @@ directly.)
file locking.
* Interrupt Input:: Getting an asynchronous signal when
input arrives.
+* IOCTLs:: Generic I/O Control operations.
@end menu
@@ -88,7 +91,7 @@ parameters (using the @samp{|} operator in C).
@xref{File Status Flags}, for the parameters available.
The normal return value from @code{open} is a non-negative integer file
-descriptor. In the case of an error, a value of @code{-1} is returned
+descriptor. In the case of an error, a value of @math{-1} is returned
instead. In addition to the usual file name errors (@pxref{File
Name Errors}), the following @code{errno} error conditions are defined
for this function:
@@ -240,7 +243,7 @@ until the program ends. To avoid this calls to @code{close} should be
protected using cancelation handlers.
@c ref pthread_cleanup_push / pthread_cleanup_pop
-The normal return value from @code{close} is @code{0}; a value of @code{-1}
+The normal return value from @code{close} is @math{0}; a value of @math{-1}
is returned in case of failure. The following @code{errno} error
conditions are defined for this function:
@@ -422,7 +425,7 @@ If @code{read} returns at least one character, there is no way you can
tell whether end-of-file was reached. But if you did reach the end, the
next read will return zero.
-In case of an error, @code{read} returns @code{-1}. The following
+In case of an error, @code{read} returns @math{-1}. The following
@code{errno} error conditions are defined for this function:
@table @code
@@ -564,7 +567,7 @@ is therefore faster.
You can use the @code{O_FSYNC} open mode to make @code{write} always
store the data to disk before returning; @pxref{Operating Modes}.
-In the case of an error, @code{write} returns @code{-1}. The following
+In the case of an error, @code{write} returns @math{-1}. The following
@code{errno} error conditions are defined for this function:
@table @code
@@ -761,7 +764,7 @@ file takes up less space than it appears so; it is then called a
@cindex holes in files
If the file position cannot be changed, or the operation is in some way
-invalid, @code{lseek} returns a value of @code{-1}. The following
+invalid, @code{lseek} returns a value of @math{-1}. The following
@code{errno} error conditions are defined for this function:
@table @code
@@ -944,7 +947,7 @@ see @ref{Creating a Pipe}.
This function returns the file descriptor associated with the stream
@var{stream}. If an error is detected (for example, if the @var{stream}
is not valid) or if @var{stream} does not do I/O to a file,
-@code{fileno} returns @code{-1}.
+@code{fileno} returns @math{-1}.
@end deftypefun
@cindex standard file descriptors
@@ -1122,6 +1125,341 @@ terminal settings that were in effect at the time, flush the output
streams for that terminal before setting the modes. @xref{Terminal
Modes}.
+@node Scatter-Gather
+@section Fast Scatter-Gather I/O
+@cindex scatter-gather
+
+Some applications may need to read or write data to multiple buffers,
+which are seperated in memory. Although this can be done easily enough
+with multiple calls to @code{read} and @code{write}, it is inefficent
+because there is overhead associated with each kernel call.
+
+Instead, many platforms provide special high-speed primitives to perform
+these @dfn{scatter-gather} operations in a single kernel call. The GNU C
+library will provide an emulation on any system that lacks these
+primitives, so they are not a portability threat. They are defined in
+@code{sys/uio.h}.
+
+These functions are controlled with arrays of @code{iovec} structures,
+which describe the location and size of each buffer.
+
+@deftp {Data Type} {struct iovec}
+
+The @code{iovec} structure describes a buffer. It contains two fields:
+
+@table @code
+
+@item void *iov_base
+Contains the address of a buffer.
+
+@item size_t iov_len
+Contains the length of the buffer.
+
+@end table
+@end deftp
+
+@deftypefun ssize_t readv (int @var{filedes}, const struct iovec *@var{vector}, int @var{count})
+
+The @code{readv} function reads data from @var{filedes} and scatters it
+into the buffers described in @var{vector}, which is taken to be
+@var{count} structures long. As each buffer is filled, data is sent to the
+next.
+
+Note that @code{readv} is not guaranteed to fill all the buffers.
+It may stop at any point, for the same reasons @code{read} would.
+
+The return value is a count of bytes (@emph{not} buffers) read, @math{0}
+indicating end-of-file, or @math{-1} indicating an error. The possible
+errors are the same as in @code{read}.
+
+@end deftypefun
+
+@deftypefun ssize_t writev (int @var{filedes}, const struct iovec *@var{vector}, int @var{count})
+
+The @code{writev} function gathers data from the buffers described in
+@var{vector}, which is taken to be @var{count} structures long, and writes
+them to @code{filedes}. As each buffer is written, it moves on to the
+next.
+
+Like @code{readv}, @code{writev} may stop midstream under the same
+conditions @code{write} would.
+
+The return value is a count of bytes written, or @math{-1} indicating an
+error. The possible errors are the same as in @code{write}.
+
+@end deftypefun
+
+@c Note - I haven't read this anywhere. I surmised it from my knowledge
+@c of computer science. Thus, there could be subtleties I'm missing.
+
+Note that if the buffers are small (under about 1kB), high-level streams
+may be easier to use than these functions. However, @code{readv} and
+@code{writev} are more efficient when the individual buffers themselves
+(as opposed to the total output), are large. In that case, a high-level
+stream would not be able to cache the data effectively.
+
+@node Memory-mapped I/O
+@section Memory-mapped I/O
+
+On modern operating systems, it is possible to @dfn{mmap} (pronounced
+``em-map'') a file to a region of memory. When this is done, the file can
+be accessed just like an array in the program.
+
+This is more efficent than @code{read} or @code{write}, as only regions
+of the file a program actually accesses are loaded. Accesses to
+not-yet-loaded parts of the mmapped region are handled in the same way as
+swapped out pages.
+
+Since mmapped pages can be stored back to their file when physical memory
+is low, it is possible to mmap files orders of magnitude larger than both
+the physical memory @emph{and} swap space. The only limit is address
+space. The theoretical limit is 4GB on a 32-bit machine - however, the
+actual limit will be smaller since some areas will be reserved for other
+purposes.
+
+Memory mapping only works on entire pages of memory. Thus, addresses
+for mapping must be page-aligned, and length values will be rounded up.
+To determine t