Простая и портативная библиотека malloc - программирование
Подтвердить что ты не робот

Простая и портативная библиотека malloc

В настоящее время я развиваюсь на Сега Сатурне.

Консоль имеет несколько выделенных фишек; некоторые из которых имеют собственную выделенную RAM и/или VRAM. Примером может служить то, как основная ОЗУ разбивается на две разные зоны 1 МБ.

Я ищу универсальную, портативную и небольшую библиотеку malloc, которая позволит мне объявлять разные зоны RAM, а затем разрешать мне malloc или free в этих зонах.

Примером может служить графический чип vdp2. Он имеет выделенную зону VRAM для цветовой палитры экранного режима 8b.

Здесь я мог бы использовать классический метод и предустановленные палитры, которые работали для всей игровой графики, но почему не только загружать палитры, которые фактически используются моей текущей графикой?

Здесь мне нужна система для выделения и свободных цветов (записи палитры), но я хочу, чтобы она потерпила неудачу, если пользователь попытался выделить более 255 цветов - так как это максимальный размер палитры.

В принципе, я хочу, чтобы иметь возможность объявлять несколько динамических зон памяти и выделять/бесплатно в них:

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

Основной malloc цепочки инструментов, который пришел с Сатурном, не сработал из коробки, поэтому я быстро написал это дерьмо:

#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;
}

Это нормально для моих текущих тестов, но в конечном итоге это будет не так, (это действительно нужно бесплатно! Но это не то, что я хочу в целом =))

Подводя итог, мне нужен минималистический, простой и простой фрагмент кода для обработки зон памяти, как описано выше. На данный момент алгоритм управления памятью не должен быть эффективным, я просто хочу, чтобы он работал. Или, может быть, вы можете отправить мне ссылку на классический и простой алгоритм управления памятью, который я могу попытаться реализовать самостоятельно?

edit > ОК, я сделал это сам, вот суть

не очень развит, но отлично работает с этим тестом:

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);
4b9b3361

Ответ 1

В принципе, вам понадобятся две процедуры управления памятью: одна, которая хранит внутреннюю работу в одной части ОЗУ, одновременно управляя другой (в данном случае, VRAM), а другая может быть любой обычной программой malloc. Для VRAM вам нужно его обрабатывать как 16, так и 256 цветовых палитр или всего 256? Если один размер, то алгоритм типа "Unit Allocator" подходит вам просто.

Для вашей основной оперативной памяти, вероятно, будет достаточно алгоритм стиля связанного списка. Здесь выполняется реализация, но с небольшим количеством работы с ногами вы можете найти МНОГИЕ, МНОГО реализаций в Интернете.

Я не смотрел сам Сатурн через 16 лет, так что это было забавно читать и редактировать для вас:)