Try to allocate memory to not have a bloc across two banks, correct management of top memory, and low memory

This commit is contained in:
Laurent Vivier 2004-02-23 00:23:14 +00:00
parent 35639aff0c
commit 1c384cf5c8

View File

@ -49,15 +49,27 @@ static int memory_find_area_by_addr(unsigned long start)
static int memory_find_area_by_size(unsigned long size) static int memory_find_area_by_size(unsigned long size)
{ {
int i; int i;
int first_choice = -1;
unsigned long phys_start, phys_end;
for (i = 0; i < pool->area_number; i++) for (i = 0; i < pool->area_number; i++)
{ {
if (size <= pool->area[i].size) if (size <= pool->area[i].size)
{ {
return i; if (first_choice == -1)
first_choice = i;
/* try to take all bloc in same memory bank */
logical2physical(pool->area[i].address, &phys_start);
logical2physical(pool->area[i].address + size - 1,
&phys_end);
if (phys_start + size - 1 == phys_end)
return i;
} }
} }
return -1; return first_choice;
} }
static void memory_remove(unsigned long start, unsigned long end) static void memory_remove(unsigned long start, unsigned long end)
@ -183,7 +195,7 @@ void memory_init()
/* add all memory to pool */ /* add all memory to pool */
memory_add(0, MemTop); memory_add(0, bank_mem_avail());
/* remove the pool array */ /* remove the pool array */
@ -195,9 +207,9 @@ void memory_init()
memory_remove( (unsigned long)&__bootloader_start, memory_remove( (unsigned long)&__bootloader_start,
(unsigned long)&__bootloader_end); (unsigned long)&__bootloader_end);
/* remove the final address of the kernel */ /* system */
memory_remove(0x0000, 0x180000); /* FIXME: why 0x180000 ? */ memory_remove(0x0000, 0x8000);
} }
void *malloc(size_t size) void *malloc(size_t size)