Get size of available memory from Multiboot

[kernel-mm]

The value displayed is one megabyte less than what you have installed
-- it displays only the "high" memory. Not a problem: it will be safer to
not touch the first megabyte.
Kernel heap handling added

[kernel-mm]

kmalloc() and kfree() are implemented. The heap is handled by a double-linked
list of block headers. The system is quite wasteful since a header
occupies a whole page, so allocate large blocks at a time, and use
sparingly.
Fixed order of .o files as parameters to ld

[bugfix]

I noticed during debugging that QEMU segfaulted if the code, that is,
the .text section grew beyond about 4k, but not exactly. After a lot
of hacking, I found that the reason is that the Multiboot header
as well as the rest of loader.s happens to be located after the C
code, and since the header has to be located in the first 4k, the
loading fails if the growth of kernel.o pushes it out of this window.
Apparently, the location of code in the .text section follows the
order of .o files passed as parameters to ld.

However, the fact that QEMU segfaulted instead of displaying an error
message and quitting means that there is a matching bug also in QEMU.
GRUB seems to be more forgiving and use a larger window when searching
for the Multiboot header, it worked OK when booted from GRUB on the
real machine.
Merge branch 'memory' into mm-merge

Further development of the memory manager needs this bugfix.