9

我目前正在世嘉土星上开发。

控制台有几个专用芯片;其中一些有自己的专用 RAM 和/或 VRAM。一个例子是如何将主 RAM 分成两个不同的 1MB 区域。

我正在寻找一个通用的、可移植的、小型的malloc库,它允许我声明不同的 RAM 区域,然后允许我进入这些区域mallocfree在这些区域内。

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

Saturn 附带的主要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;
}

我目前的测试没问题,但从长远来看不会很好,(它真的需要一个免费的!但这不是我想要的整体=))

总而言之,我需要一段简约、基本和简单的代码来处理上述内存区域。目前,内存管理算法不需要高效,我只想让它工作。或者,也许你能给我一个经典而简单的内存管理算法的链接,我可以尝试自己实现?

编辑>好的,我自己做的,这是一个要点

不是很进化,但在这个测试中可以正常工作:

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

1 回答 1

2

基本上,您需要两个内存管理例程:一个将其内部工作存储在 RAM 的一部分中,同时管理另一部分(在本例中为 VRAM),另一个可以是任何普通的 malloc 例程。对于 VRAM,您需要它来处理 16 和 256 调色板还是只处理 256?如果是单一尺寸,那么“单元分配器”类型的算法就很适合您。

对于您的主 RAM,链表样式算法可能就足够了。 在这里完成了一个实现,但只需一点点的工作,你就可以在互联网上找到很多很多的实现。

我已经有 16 年没有亲自看过土星了,所以这对你来说是一件有趣的事情:)

于 2013-07-24T18:41:15.053 回答