M2: A pager

Use your memory manager from M1 to write a simple pager. The
pager should allow ELF files to run from the boot file, however
rather than having their stack allocated in physical memory, it
should just use virtual memory. This should allow you to execute
user processes in place, i.e. from the boot image. Note
that in general a program can only be executed in-place once,
afterwards global variables may have incorrect values.

Note: In this milestone you will most likely be creating
virtual address aliases. It will be necessary for you to be aware
of the caching issues involved with the ARM processor in the
NSLU2.

Design alternatives

Probably the main thing that you should consider here is the
layout of your processes address space. Some things you will want
to consider is where you place various parts of memory such as the
stack, heap and code segments. You may also have some other
regions in your process address space, one of these is the UTCBs.

You should also think about if you want to make different
ranges of the address space have different permissions, eg: you
may want to make code read-only to prevent bugs, or have a guard
page at the end of your stack to prevent overflow.

Assessment

The main demonstration here will be to show a user process
running with a high stack pointer (> 0x2000000). You should also
demonstrate a user process using malloc() from a heap.

Note that L4 manages pagetables internally. To test your
pagetable properly it is necessary to flush L4's mappings. This
example user code should test some simple functions of your page
table and VM system. To use it you will need to add a debug
flush system call to SOS.