Obecnie pracuję nad Sega Saturn.prosta i przenośna biblioteka malloc
Konsola ma kilka dedykowanych układów; niektóre z nich mają swoją własną dedykowaną pamięć RAM i/lub VRAM. Przykładem może być podział głównej pamięci RAM na dwie różne strefy 1 MB.
Szukam ogólnej, przenośnej i małej biblioteki malloc
, która pozwoli mi zadeklarować różne strefy pamięci RAM, a następnie pozwolić mi na malloc
lub free
w tych strefach.
Przykładem może być układ graficzny vdp2. Posiada wydzieloną strefę VRAM dla palety kolorów trybu ekranu 8b.
Tutaj mógłbym użyć klasycznej metody i wstępnie załadować palety, które działały dla wszystkich gier, , ale dlaczego nie tylko ładować palety, które są aktualnie używane przez moją obecną grafikę?
Tutaj potrzebuję systemu do przydzielania i usuwania kolorów (wpisy palet), ale chciałbym, żeby się nie udało, jeśli użytkownik spróbuje przydzielić więcej niż 255 kolorów - ponieważ jest to maksymalny rozmiar palety.
Zasadniczo, chcę być w stanie zadeklarować kilka dynamiczne strefy pamięci i alokacji/wolne do nich:
u32 palRam = defineMallocZone(COLOR_PALETTE,COLOR_PALETTE_SIZE);
u32 m68kRam = defineMallocZone(M68KVRAM,M68KVRAMSIZE);
u32 highRam = defineMallocZone(HIGHRAM,1024*1024);
u16* my64colors = (u16*)magicMalloc(palRam,64*sizeof(u16));
Głównym malloc
narzędzia łańcuchu dostarczonym z Saturna nie pracował z okno, więc szybko napisałem to gówno:
#define mallocSizeK 512
#define mallocSizeB mallocSizeK*1024
void * mymalloc(u32 n)
{ static u8 m[mallocSizeB];
static u32 c=0;
if(!n) return (void*)&c;
while(n%4) n++;
u32 nn = c+n;
if(nn > mallocSizeB) return 0;
u8 * p = &m[c]; c = nn; memset(p,0,n);
return (void*)p;
}
jest ok dla moich obecnych badań, ale to nie będzie dobrze na dłuższą metę (to naprawdę trzeba darmowa ale to nie jest to, co chcę! overall =))
Podsumowując, potrzebuję minimalistycznego, prostego i prostego fragmentu kodu do obsługi stref pamięci, jak opisano powyżej. Na razie algorytm zarządzania pamięcią nie musi być wydajny, po prostu chcę, żeby działał. A może możesz wysłać mi link do klasycznego i prostego algorytmu zarządzania pamięcią, który mogę spróbować zaimplementować?
edit> ok, ja zrobiłem to sam, here is a gist
nie bardzo ewoluowały, ale działa dobrze z tego testu:
u32* b1 = bnew(M68KVRAM,512);
void*mtest[500]; u32 allocSize = 8;
u32 n = 0, nb=0, total=0;
while(n<500){
u32 sz = rand()%(allocSize*1024);
void *a = bmalloc(b1,sz);
if(!a) break;
memset(a,1,sz);
mtest[n++] = a;
total += sz;
};
nb = n; printlr("allocated %u/512 kb in %u 0~%uk blocs",total>>10,nb,allocSize);
printl("free them all .. ");
u32 freertn = 0; for(n=0;n<nb;n++) freertn |= (u32)bfree(b1,mtest[n]);
if(freertn) printlr("fail"); else printlr("ok");
*mtest = bmalloc(b1,512*1024);
if(*mtest) memset(*mtest,200,512*1024);
printlr("final 512k allocation return : 0x%x",*mtest);
Trudno powiedzieć, co prosisz. Szukasz bibliotek dla malloc? przykłady malloc? wolny, by iść z twoim malloc? Edytuj to i dodaj jedno zwięzłe pytanie. – jwiscarson