Nabend zusammen,
ich war gerade dabei mir meine Bitmap-Algorthmen anzuschauen.
Wollte ein wenig optimieren und habe mir mal den LOST-Code angeschaut.
Da habe ich mich gefragt, warum der Code funktioniert.
static struct mem_block get_free_block
(struct multiboot_info* multiboot_info, size_t i)
{
struct mem_block result;
// Überprüfung der BIOS-Memory-Map
struct multiboot_mmap* mmap;
uintptr_t mmap_addr = multiboot_info->mi_mmap_addr;
uintptr_t mmap_end = mmap_addr + multiboot_info->mi_mmap_length;
for(mmap = (struct multiboot_mmap*) (mmap_addr);
mmap < (struct multiboot_mmap*) (mmap_end);
mmap++)
{
// Typ 1 steht für freien Speicher
if (mmap->mm_type == 1) {
if (i-- == 0) {
result.start = (paddr_t)((uintptr_t) mmap->mm_base_addr);
result.end = (paddr_t)((uintptr_t) mmap->mm_base_addr
+ (dword) mmap->mm_length - 1);
return result;
}
}
}
result.start = (paddr_t) 0xFFFFFFFF;
result.end = (paddr_t) 0;
return result;
}
i ist bei euch ja die größe der bitmap in bytes.
Wenn ich mir das mal so anschaue sucht ihr euch den letzten freien Block, der in der GRUB-mmap liegt.
Wie kann das funktionieren?
Warum sucht ihr euch nicht einfach einen Block, der die Größe bietet, die ihr sucht.
Dann könnt ihr davon doch einfach eure größe abziehen und schon passt es.
Oder verstehe ich euren Code falsch?
[EDIT]
Ich habe mir mal aus Spaß diese Methode bei mir eingebaut und dann meldet er mir beim booten, dass er nicht genug speicher findet.
Was mich acuh nicht weiter wundert.
i = 4094 bei mir und und er findet genau zwei freie Blöcke.
Die haben jeweils mehr als genug freien Speicher.
Das verwundert mich jetzt nur umso mehr, dass der Code funktioniert