Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1828639
  • 博文数量: 286
  • 博客积分: 3713
  • 博客等级: 少校
  • 技术积分: 2275
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-11 09:47
个人简介

http://blog.chinaunix.net/uid/16979052.html

文章分类

全部博文(286)

文章存档

2018年(1)

2017年(16)

2016年(9)

2015年(17)

2014年(15)

2013年(112)

2012年(116)

分类: LINUX

2012-06-29 13:55:32

#include

#define MALLOC_MAGIC 0x6D92 /* must be < 0x8000 */

typedef struct _malloc
{
size_t size;
struct _malloc *next;
unsigned magic : 15;
unsigned used : 1;
} malloc_t;

static unsigned char *heap_bot,*heap_top;

void *kmalloc(size_t size)
{
size_t required;
malloc_t* n;
required=size+sizeof(malloc_t);
malloc_t* m=(malloc_t*)heap_bot;
if(m)
{
if(m->magic!=MALLOC_MAGIC)
{
KPRINTF("Corrupted Heap\n");
return NULL;
}
while(m)
{
if(m->used==1)
{
m=m->next;
continue;
}
if(m->size
{
m=m->next;
continue;
}
//we can allocate
n=m+sizeof(malloc_t)+size;
n->magic=MALLOC_MAGIC;
n->used=0;
n->next=m->next;
n->size=m->size-size-sizeof(malloc_t);
m->used=1;
m->next=n;
m->size=size;
return ((char*)m+sizeof(malloc_t));
}
}
KPRINTF("No Memory for allocation\n");
return NULL;
}
void kfree(void *p)
{
malloc_t *m;
m = (malloc_t *)((char *)p - sizeof(malloc_t));
if(((unsigned char*)p< heap_bot)||((unsigned char *)p>heap_top))
{
KPRINTF("Illegal memory area [%x]\n", (unsigned int)p);
return;
}
//so p is within our limit
if(m->magic!=MALLOC_MAGIC)
{
KPRINTF("*** Bad Magic / corrupted heap\n");
return;
}
if(m->used==0)
{
//unused memory
KPRINTF("***Trying to free unused Unused memory\n");
return;
}
//if we reached here means we are to mark the block as free
m->used=0;
//try unfragment the heap
m=(malloc_t*)heap_bot;
for(; m!=NULL; m=m->next)
{
while(!m->used && m->next != NULL && !m->next->used)
{
/* resize this block */
m->size += sizeof(malloc_t) + m->next->size;
/* merge with next block */
m->next = m->next->next;
}
}
}
void kmemdump()
{
unsigned blks_used = 0, blks_free = 0;
size_t bytes_used = 0, bytes_free = 0;
malloc_t *m;
int total;
KPRINTF("===============================================\n");
for(m = (malloc_t *)heap_bot; m != NULL; m = m->next)
{
KPRINTF("blk %x: %d bytes", (unsigned int)m, m->size);
if(m->used)
{
blks_used++;
bytes_used += m->size;
KPRINTF(" used\n");
}
else
{
blks_free++;
bytes_free += m->size;
KPRINTF(" free\n");
}
}
KPRINTF("blks:  %d used, %d free, %d total\n", blks_used , blks_free, blks_used + blks_free);
KPRINTF("bytes: %d used, %d free, %d total\n", bytes_used, bytes_free, bytes_used + bytes_free);
total = (bytes_used + bytes_free) + (blks_used + blks_free) * sizeof(malloc_t);
if(total != heap_top - heap_bot)
KPRINTF("*** some heap memory is not accounted for\n");
KPRINTF("===============================================\n");
}
static void mem_init()
{
heap_bot=(unsigned char*)&kernelEnd;
heap_top=(unsigned char*)(bootInfo.memUpper*1024);
KPRINTF("Memory :%x --- %x\n", heap_bot, heap_top);
if(heap_top<=heap_bot)
{
KPRINTF("Memory Error\n");
halt();
}
malloc_t* m=(malloc_t*)heap_bot;
//claim all the available memory after kernel end.
m->magic= MALLOC_MAGIC;
m->next=NULL; //nothing after this block
m->size=heap_top-heap_bot-sizeof(malloc_t); //total memory available
m->used=0;    //not used free/available
}
INITFUNC(mem_init, INIT_MEM);

阅读(1499) | 评论(0) | 转发(0) |
0

上一篇:kernel/tss.c

下一篇:kernel/sched.c

给主人留下些什么吧!~~