⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 balloc.c

📁 Intel x86处理器的汇编器
💻 C
字号:
/* * *	the file for mik's assmbler: a64 poject; * **/#include "balloc.h"/* free-memory-link buffer */static mem_link_t free_link_buf[FREELINKSIZE];/* used-memory-link buffer */static mem_link_t used_link_buf[USEDLINKSIZE];/* default buffer-heap for balloc() */static char buf_heap[POOLSIZE];/* alloc-heap-struct for balloc() */static alloc_heap_t alloc_heap, *alloc_heap_ptr = &alloc_heap;/* * this function for test.... */void print_alloc_heap(){	mem_link_t *free_link = alloc_heap_ptr->free_link;	mem_link_t *used_link = alloc_heap_ptr->used_link;	int i = 1;	printf("\nfree_link_buf is %x\n", free_link_buf);	printf("used_link_buf is %x\n", used_link_buf);	printf("buffer heap is %x\n\n", alloc_heap_ptr->heap);		printf("            free buffer-heap-link:                \n");		printf("--------------------------------------------------\n");	printf("no.\tsize\thead\ttail\tused\n");		while (free_link) { 		printf("%d\t%d\t%x\t%x\t%d\n", i++, free_link->size,			free_link->head_ptr, free_link->tail_ptr,			free_link->used);		free_link = free_link->next;	}	puts("\n");	puts("              used buffer-heap-link:                  ");	puts("------------------------------------------------------");	printf("no.\tsize\thead\ttial\tused\n");		i = 1;	while (used_link) {		printf("%d\t%d\t%x\t%x\t%d\n", i++, used_link->size,			used_link->head_ptr, used_link->tail_ptr, 			used_link->used);		used_link = used_link->next; 	}}__inline__ void init_mem_link() {	memset(free_link_buf, 0, sizeof(free_link_buf));	memset(used_link_buf, 0, sizeof(used_link_buf));}int init_alloc_heap(unsigned int size, void *bufptr){	unsigned int poolsize;	/* initialize the free_link_buf & used_link_buf */	init_mem_link();			/* the buffer pool already initialize */	if (alloc_heap_ptr->heap && alloc_heap_ptr->heap == bufptr) 		return EOK;	if (!bufptr) {		/* default buffer heap for user */		alloc_heap_ptr->heap = (void *)buf_heap;		poolsize = POOLSIZE;	} else {		if (!size)			return EINIT;		alloc_heap_ptr->heap = (void *)bufptr;		poolsize = size;	}	memset(alloc_heap_ptr->heap, 0, poolsize);	alloc_heap_ptr->total_size = poolsize;	alloc_heap_ptr->free_size = poolsize;	alloc_heap_ptr->used_link = 0;	alloc_heap_ptr->free_link = &free_link_buf[0];	/* free-heap-link initialize */	free_link_buf[0].size = alloc_heap_ptr->free_size;	free_link_buf[0].head_ptr = (void *)alloc_heap_ptr->heap;	free_link_buf[0].tail_ptr = (void *)alloc_heap_ptr->heap + poolsize;	free_link_buf[0].used = 1;	free_link_buf[0].next = 0;	free_link_buf[0].prev = 0;				/* successed */	return EOK;}/* allocate a mem-link */unsigned int alloc_memlink(mem_link_t *mem_link){	int i = 0;	int linksize = 		mem_link == free_link_buf ? FREELINKSIZE : USEDLINKSIZE;	while (i < linksize)  {		if (mem_link[i].used == 0)	/* free */			return i;		i++;	}		return -1;}__inline__ unsigned int alloc_free_memlink(){	return alloc_memlink(free_link_buf);}__inline__ unsigned int alloc_used_memlink(){	return alloc_memlink(used_link_buf);}/**********************************************************************/unsigned int mount_link(mem_link_t *link, mem_link_t *new){	int is_free_link = link == alloc_heap_ptr->free_link ? 1 : 0;	while (link) {		if (is_free_link) {			if ((link->tail_ptr + 1 == new->head_ptr)				&& (link->next->head_ptr == new->tail_ptr + 1))			{				link->tail_ptr += new->size + link->next->size;				link->next = link->next->next;				link->size += new->size + link->next->size;				memset(link->next, 0, sizeof(mem_link_t));				memset(new, 0, sizeof(mem_link_t));				return EOK;			} else if (link->tail_ptr + 1 == new->head_ptr) {				link->tail_ptr += new->size;				link->size += new->size;				memset(new, 0, sizeof(mem_link_t));				return EOK;			} else if (link->head_ptr == new->tail_ptr + 1) {				link->head_ptr -= new->size;				link->size += new->size;				memset(new, 0, sizeof(mem_link_t));				return EOK;			} 		} 		if (!link->next) break;		link = link->next;	}	link->next = new;	link->next->next = 0;	link->next->prev = link;	return EOK;}/* the function: mount the free memory link */unsigned int mount_free_link(void *ptr, unsigned int size){	int number = alloc_free_memlink();	if (number == -1) return -1;		free_link_buf[number].used = 1;	free_link_buf[number].head_ptr = ptr;	free_link_buf[number].tail_ptr = ptr + size - 1;	free_link_buf[number].size = size;	if (alloc_heap_ptr->free_link)		return mount_link(alloc_heap_ptr->free_link, 			&free_link_buf[number]);		free_link_buf[number].next = 0;	free_link_buf[number].prev = 0;	alloc_heap_ptr->free_link = &free_link_buf[number];		return EOK;}/* the function: mount the used memory link */unsigned int mount_used_link(void *ptr, unsigned int size) {	int number = alloc_used_memlink();		if (number == -1) return -1;	used_link_buf[number].used = 1;		/* used by alloc */	used_link_buf[number].size = size;	used_link_buf[number].head_ptr = ptr;	used_link_buf[number].tail_ptr = ptr + size - 1;	if (alloc_heap_ptr->used_link)		return mount_link(alloc_heap_ptr->used_link,			&used_link_buf[number]);	/* no used and full free */		used_link_buf[number].next = 0;	used_link_buf[number].prev = 0;	alloc_heap_ptr->used_link = &used_link_buf[number];			return EOK;}/***********************************************************************/__inline__ void do_umount_link(mem_link_t *old){	if (old->prev) 		old->prev->next = old->next;			if (old->next) 		old->next->prev = old->prev;}void umount_free_link(mem_link_t *old, unsigned int size){	old->used = 0;	alloc_heap_ptr->free_size -= size;		if (!old->prev && !old->next) {		/* only 1-node */		if (alloc_heap_ptr->free_size == 0)			alloc_heap_ptr->free_link = 0;		else {			old->used = 1;			old->size -= size;			old->head_ptr += size;		}				} else if (!old->prev) {		alloc_heap_ptr->free_link = old->next;		old->next->prev = 0;	} else		do_umount_link(old);}void umount_used_link(mem_link_t *old){	old->used = 0;	alloc_heap_ptr->free_size += old->size;	if (!old->prev && !old->next) 		if (alloc_heap_ptr->free_size == alloc_heap_ptr->total_size) {			alloc_heap_ptr->used_link = 0;		} else {			old->used = 1;		}	else if (!old->prev) {		alloc_heap_ptr->used_link = old->next;		old->next->prev = 0;	} else		do_umount_link(old);}/***********************************************************************//* the function same as C malloc */void *balloc(unsigned int size){	mem_link_t *free_link = alloc_heap_ptr->free_link;	mem_link_t *used_link = alloc_heap_ptr->used_link;	while (free_link && (alloc_heap_ptr->free_size >= size)) {		if (free_link->size >= size) {		/* OK */			void *ret = free_link->head_ptr;			/* mount at used link */			if (mount_used_link(ret, size) == -1) {				return 0;			}			/* umount the free link */			umount_free_link(free_link, size);			return ret;		}		free_link = free_link->next;	}	return 0;}/* the function same as C free */int bfree(void *ptr){	if (!ptr) return EOK;	mem_link_t *used_link = alloc_heap_ptr->used_link;	mem_link_t *free_link = alloc_heap_ptr->free_link;	while (used_link) {		if ((ptr >= used_link->head_ptr) && 			(ptr <= used_link->tail_ptr)) 		{			/* umount used link, so the memory block is free */			umount_used_link(used_link);			/* mount at free link*/			mount_free_link(ptr, used_link->size);				return EOK;		}		used_link = used_link->next;	}	return EERROR;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -