Zu 1.: Du musst alles reservieren, was du nicht überschreiben willst. Darunter fallen (vermutlich) die Multibootstruktur selbst, die Informationen über die Module (gegebenfalls inklusive Kommandozeile der Module), eventuell die Memory Map, und natürlich die Module selbst. Außerdem der Kernel (dazu steht was im
Tutorial). Und natürlich die Bitmap, wenn du die dynamisch anlegst, und alles andere was du dynamisch anlegst. Bei manchen stehen ja die Adressen explizit dran (Module, ...), bei anderen ist es halt
mbs_mmap_addr bis
mbs_mmap_length+mbs_mmap_length-1 und
mbs_mods_addr bis
mbs_mods_addr+mbs_mods_count*sizeof(struct multiboot_module)-1 oder so. Wenn du den Virtual 8086 Mode nutzen willst, außerdem die
IVT (0 bis 0x400-1), die
BDA (0x400 bis 0x500-1) und die
EBDA (Adresse steht in der BDA, als Endadresse kannst du z.B. 640 KB-1 annehmen).
2. Nein, der Wert davon ist im Allgemeinen kleiner als die Größe des Speichers. Wenn du den Wert verwendest, kannst du also nicht gesamten Speicher nutzen. Ein bisschen was dazu hab ich kürzlich hier geschrieben:
http://forum.lowlevel.eu/index.php?topic=3104.0