Hallo,
der PCI-Bus hat nur einen 32-Bit-Adressraum, d.h. sämtliche PCI-Geräte können ihre MMIO-Bereiche können nur in die unteren 4 GB des Adressraums legen. Die Größe des dafür freigehaltenen Bereichs legt das BIOS fest, gelegentlich auch in Absprache mit der Hardware (i.d.R. zwischen 256 MB und 1 GB). Das gleiche Problem gab es früher auch mal, da ISA nur 24 Bit (16 MB) adressieren kann und dafür konnte man im BIOS den Bereich zwischen 15 und 16 MB reservieren. Außerdem ist der Bereich zwischen 640 KB und 1 MB immer reserviert.
Da du Löcher im Speicher hast, kannst du die Größe nicht aus der höchsten Adresse berechnen, sondern musst die Größen der einzelnen Speicherbereiche addieren (mmap1.length + mmap2.length + ... mmapN.length). Die Felder mem_lower und mem_upper solltest du nur als Fallback-Lösung benutzen, wenn du keine memory map übergeben bekommen hast, da sie nicht eindeutig sind (hängt von den Interrupts ab, die das BIOS unterstützt).
Gruß,
Svenska