2013-07-24 10 views
10

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); 
+0

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

Odpowiedz

2

Zasadniczo, potrzebne są dwie procedury zarządzania pamięcią: jeden, który przechowuje swoje wewnętrzne funkcjonowanie w jedna część pamięci RAM podczas zarządzania inną (w tym przypadku VRAM), a druga może być normalną procedurą malloc. W przypadku VRAM potrzebujesz go do obsługi zarówno palet 16 i 256 kolorów, czy tylko 256? W przypadku pojedynczego rozmiaru, algorytm typu "Alokator jednostki" będzie dla Ciebie odpowiedni.

Dla głównej pamięci RAM, algorytm stylu listy połączonej prawdopodobnie byłby wystarczający. An implementation odbywa się tutaj, ale przy odrobinie pracy nóg można znaleźć WIELE, wiele implementacji w Internecie.

Nie spojrzał na Saturna się w 16 lat, więc to była dobra zabawa do odczytu i edycji dla ciebie :)

+0

tak, paleta nie jest doskonałym przykładem, ponieważ musi obsługiwać współdzielenie kolorów między duszkami i uzyskać stałą wielkość pamięci, więc wymagany będzie dedykowany kod, ale chcę być w stanie podać tylko 64 lub 96 kolorów do tego systemu bez ponownej kalkulacji jego pamięci RAM przesunięcie i po prostu niech będzie dynamiczne. Chcę obsługiwać wszystkie tryby palety w saturnie, każde tło vdp2 może uzyskać swój własny tryb koloru, rozdzielczość i paletę, ale jest to tylko możliwy przypadek użycia, dlaczego potrzebuję ogólnego systemu. Wdrożone przez ciebie implementacje są proste, i +1 do tego i próbuję zaimplementować własne darmowe :) do edytowania, ale nie jestem angielski ^^ – r043v

+0

Dobrze rozumiesz :) Po prostu posprzątałem trochę dla innych , bez konsolowych ludzi, aby zrozumieć trochę lepiej. –

Powiązane problemy