- 注册时间
- 2004-12-25
- 最后登录
- 1970-1-1
|
发表于 2007-11-23 19:19:49
|
显示全部楼层
那个模块我也没用过,代码怎么改的我也不很清楚......
下面这个代码是所有解释器通用的,包括gvm,gvm2,lavax.
而且已经去掉了整理内存,也不需要记录指针的地址,但是在释放时会检测合并空闲的内存,提高内存的利用率.- #define RamSize 0x6FFF //解释器能使用的最大内存地址(0x6fff(LavaX20K), 0x7fff(LavaX24K), 0xffff(GVM2))
- long RamMax = RamSize;
- long ListHead = RamSize;
- long ListEnd = RamSize;
- struct INFO
- {
- long next; //下一块内存地址
- long last; //上一块内存地址
- long pointadd; //被返回指针的地址
- long size; //大小
- char used; //是否空闲
- };
- #define INFO_next_offset 0
- #define INFO_last_offset 4
- #define INFO_pointadd_offset 8
- #define INFO_size_offset 12
- #define INFO_used_offset 16
- long GetRamSize(long point) //取得内存块的大小
- {
- long Number;
- memcpy(&Number, point - sizeof(struct INFO) + INFO_size_offset, 4);
- //return ((INFO *)point)->size;
- return Number;
- }
- /*
- void ShowRamState(long x, long y) //显示当前动态内存状态
- {
- long info;
- if (ListHead == RamMax)
- {
- return;
- }
- for (info = ListHead; info != NULL; )
- {
- DigitOut(x, y, info + sizeof(struct INFO));
- DigitOut(x + 50, y, GetRamSize(info + sizeof(struct INFO)));
- if (*(info + INFO_used_offset))
- {
- TextOut(x + 90, y, "使用中");
- }
- else
- {
- TextOut(x + 90, y, "空闲");
- }
- y = y + 16;
- memcpy(&info, info + INFO_next_offset, 4); //info = info->next;
- }
- TextOut(x, y, "RamEnd");
- }
- */
- void ClearRam() //重置动态内存
- {
- RamMax = RamSize;
- ListHead = RamSize;
- ListEnd = RamSize;
- }
- void free(long point) //释放内存,并合并其前后的空闲内存
- {
- long info;
- long size1,size2;
- long last, next;
- info = point - sizeof(struct INFO);
- memcpy(&last, info + INFO_last_offset, 4); //last = info->last;
- memcpy(&next, info + INFO_next_offset, 4); //next = info->next;
- if(next == 0)//判断是否为最后一块内存
- {
- //查找最后一个非空闲内存块
- while (!(*(last + INFO_used_offset)))
- {
- memcpy(&last, last + INFO_last_offset, 4); //last = last->last;
- }
- ListEnd = last;
- memset(ListEnd + INFO_next_offset, 0, 4);//重置链表尾
- }
- else
- {
- //向上检测合并
- if (info != ListHead)
- {
- if (!(*(last + INFO_used_offset)))
- {
- memcpy(&size1, last + INFO_size_offset, 4); //size1 = last->size;
- memcpy(&size2, info + INFO_size_offset, 4); //size2 = info->size;
- size1 = size1 + size2 + sizeof(struct INFO);//
- memcpy(info + INFO_size_offset, &size1, 4); //last->size = size1 + size2 + sizeof(struct INFO);
- memcpy(info + INFO_last_offset, last + INFO_last_offset, 4); //info->last = last->last;
- if (last == ListHead)
- {
- ListHead = info;
- }
- else
- {
- memcpy(&last, last + INFO_last_offset, 4);
- memcpy(last + INFO_next_offset, &info, 4); //last->last->next = info;
- }
- }
- }
-
- //向下检测合并
- if (!(*(next + INFO_used_offset)))
- {
- memcpy(next + INFO_last_offset, info + INFO_last_offset, 4);//next->last = info->last;
- memcpy(&size1, info + INFO_size_offset, 4); //
- memcpy(&size2, next + INFO_size_offset, 4); //
- size1 = size1 + size2 + sizeof(struct INFO); //
- memcpy(next + INFO_size_offset, &size1, 4); //info->size = size1 + size2 + sizeof(steuct INFO);
- if (info == ListHead)
- {
- ListHead = next;
- }
- else
- {
- memcpy(&last, info + INFO_last_offset, 4);
- memcpy(last + INFO_next_offset, &next, 4); //info->last->next = next;
- }
- info = next;
- }
-
- *(info + INFO_used_offset) = 0;
- }
- }
- long malloc(long R_SIZE)//分配内存,返回被分配的内存地址
- {
- long lastadd; //暂存一下地址
- long info;
- long temp;
- long lastornext;
- char test;
-
- //寻找现有空闲内存
- if( ListHead != ListEnd) //说明有已开辟的内存
- {
- info = ListHead;
- while(info)
- {
- memcpy(&temp, info + INFO_size_offset, 4);
- if((*(info + INFO_used_offset) == 0) && (temp >= R_SIZE))//未使用的内存块,且容量足够,多出的空间被设置为新的空闲内存
- {
- if(temp - R_SIZE > sizeof(struct INFO))//有足够的多余空间设置新的空闲内存
- {
- lastadd = info + R_SIZE + sizeof(struct INFO);//添加节点
-
- if(info != ListHead)
- {
- memcpy(&lastornext, info + INFO_last_offset, 4); //lastornext = info->last;
- memcpy(lastornext + INFO_next_offset, lastadd, 4); //lastornext->next = lastadd;
- }
- else
- {
- ListHead = lastadd;
- }
-
- lastornext = lastadd;
- memcpy(lastornext + INFO_next_offset, &info, 4); //lastornext->next = info;
- memcpy(lastornext + INFO_last_offset, info + INFO_last_offset, 4); //lastornext->last = info->last;
- memcpy(&temp, info + INFO_size_offset, 4);
- temp = temp - R_SIZE - sizeof(struct INFO);
- memcpy(lastornext + INFO_size_offset, &temp, 4); //lastornext->size = info->size - R_SIZE - sizeof(struct INFO);
- *(lastornext + INFO_used_offset) = 0; //lastornext->used = 255;
- memcpy(info + INFO_last_offset, &lastornext, 4); //info=>last = lastornext;
- memcpy(info + INFO_size_offset, &R_SIZE, 4); //info->size = R_SIZE;
- }
- *(info + INFO_used_offset) = 255;
- return (info + sizeof(struct INFO));
- }
- memcpy(&info, info + INFO_next_offset, 4);
- }
- }
-
- //开辟新内存
- if(&test + R_SIZE + sizeof(struct INFO) >= ListEnd)
- {
- return 0;
- }
-
- //保留上一个内存块的地址
- lastadd = ListEnd;
-
- if(ListEnd < RamMax)
- {
- //修改上一个内存块的next地址
- temp = ListEnd - R_SIZE - sizeof(struct INFO);
- memcpy(ListEnd + INFO_next_offset, &temp, 4); //ListEnd->next = ListEnd - R_SIZE - sizeof(struct INFO);
- //修改动态内存链表尾
- ListEnd = temp;
- }
- else
- {
- //第一块内存
- ListEnd = ListEnd - R_SIZE - sizeof(struct INFO);
- ListHead = ListEnd;
- }
-
- info = ListEnd;
- memcpy(info + INFO_last_offset, &lastadd, 4); //info->last = lastadd;
- memset(info + INFO_next_offset, 0, 4); //info->next = 0;
- memcpy(info + INFO_size_offset, &R_SIZE, 4); //info->size = R_SIZE;
- *(info + INFO_used_offset) = 255; //info->used = 255;
- return info + sizeof(struct INFO);
- }
复制代码 |
|