我正在世嘉土星上开发.
控制台有几个专用芯片;其中一些有自己的专用RAM和/或VRAM.一个例子是如何将主RAM分成两个不同的1MB区域.
我正在寻找一个通用的,可移植的和小型的malloc库,它将允许我声明不同的RAM区域,然后允许我在这些区域内进行malloc或free.
一个例子是vdp2图形芯片.它具有用于屏幕模式8b的调色板的专用VRAM区域.
在这里,我可以使用一种经典的方法和预加载适用于所有游戏图形的调色板,
但是为什么不仅加载我当前图形实际使用的调色板?
这里我需要一个系统来分配和释放颜色(调色板条目),但是如果用户尝试分配超过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,n); return (void*)p; }
对我目前的测试没关系,但从长远来看并不会很好(真的需要一个免费的,但这不是我想要的)=))
总而言之,我需要一个简约的,基本的和简单的代码来处理如上所述的内存区域.现在,内存管理算法不需要高效,我只是想让它运行.或者也许你可以给我一个链接到经典和简单的内存管理算法,我可以尝试实现自己?
编辑>好的,我自己做了,here is a gist
这个测试没有很好的演变,但工作正常:
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);
解决方法
基本上,您需要两个内存管理例程:一个存储其内部工作在RAM的一部分,同时管理另一个(在这种情况下为VRAM),另一个可以是任何正常的malloc例程.对于VRAM,您需要它来处理16和256色调色调还是仅处理256色?如果一个单一的大小,那么一个“单位分配器”类型的算法会适合你就好了.
对于您的主RAM,链表风格算法可能就足够了. An implementation在这里完成,但只是一点腿的工作,你可以在互联网上找到很多,多个实现.
16年来我没有看过土星,所以这是一个有趣的事情,为你阅读和编辑:)