gpt4 book ai didi

c - 简单便携的 malloc 库

转载 作者:太空狗 更新时间:2023-10-29 16:49:55 25 4
gpt4 key购买 nike

我目前正在 Sega Saturn 上开发。

控制台有几个专用芯片;其中一些有自己专用的 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;
}

我目前的测试还可以,但从长远来看就不行了,(它真的需要免费!但这不是我想要的总体=))

总而言之,我需要一段简约、基本且简单的代码来处理上面概述的内存区域。现在,内存管理算法不需要高效,我只希望它能工作。或者,您能否向我发送一个指向我可以尝试自己实现的经典且简单的内存管理算法的链接?

编辑> 好的,我自己做了,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已在此处完成,但只要稍加努力,您就可以在 Internet 上找到很多很多实现。

我已经 16 年没有亲自看过土星了,所以对您来说,阅读和编​​辑这篇文章很有趣 :)

关于c - 简单便携的 malloc 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com