`
frenchmay
  • 浏览: 233515 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

简陋的内存管理单元

阅读更多

最近翻开了在学校曾经学过的ssd7 系统级编程的课件和实验材料。

用单向链表实现了一个丑陋的内存管理单元。

 

太tmd丑陋了

#include <stdlib.h>
#include <string.h>
#include "debugmalloc.h"
#include "dmhelper.h"
#include <stdio.h>

#define BARRIER 0xCCDEADCC

struct memory
{
	int size; //the size of the memory
	int checkCode;
	int lineNo;
	char *filename;
	struct memory *next;
};
struct memory *p = NULL;     //the link list to save the memory information

struct memory * deleteNode(struct memory * head, struct memory * node)
{
	struct memory * before = NULL;
	struct memory * temp = NULL;
	struct memory * deleted = NULL;
	before = head;

	if(head != NULL)
	{
		while(before->next != NULL && before->next != node)
		{
			before = before->next;
		}
		if( before->next != NULL)
		{
			printf("delete lineNo %d\n", node->lineNo);
			temp = before->next->next;
			deleted = before->next;
			before->next = temp;
			free(deleted);
		}
	}
	return head;
}

struct memory * addNode(struct memory * head, int size, int checkCode, int lineNo, char * filename)
{
	struct memory * next = NULL;
	struct memory * node = (struct memory *)malloc(sizeof(struct memory));

	if (NULL == head)
	{
		head = (struct memory *)malloc(sizeof(struct memory));
		head->size = 0;
		head->checkCode = 0;
		head->lineNo = 0;
		head->filename = NULL;
		head->next = NULL;
	}
	next = head;

		
	while(NULL != next->next)
	{
		next = next->next;
	}

	node->size = size;
	node->checkCode = checkCode;
	node->lineNo = lineNo;
	node->filename = filename;
	node->next = NULL;

	next->next = node;
	p = head;
	return next->next;
}



/* Wrappers for malloc and free */

/* code/info  /size /barrier/place /barrier */
/* int /struct memory * /int  /int	/place /int */

void *MyMalloc(size_t size, char *filename, int linenumber) 
{
	int totalSize = size + 4*sizeof(int) + sizeof(struct memory *);
	
	void * head;

	int * intHead;

	void * ret = NULL;
	
	int checkCode = 11;

	struct memory * node = NULL;

	char * info = malloc(sizeof(char) * (strlen(filename + linenumber) +1));

	strcpy(info, filename + linenumber);

	node = addNode(p, size, checkCode, linenumber,info);

	head = (void *)(malloc(totalSize));
	
	intHead = (int *)head;
	
	*intHead = checkCode;

	intHead ++;

	*intHead = node;

	intHead ++;

	*intHead = size;

	intHead++;

	*intHead = BARRIER;
	intHead++;

	head = (void *)(intHead);
	ret = head;

	head = (char *)head + size;

	intHead = (int *)head;

	*intHead = BARRIER;

	return ret;
}

void MyFree(void *ptr, char *filename, int linenumber)
 {
	char * head = NULL;
	int * intPtr = NULL;
	int * barrierRight = NULL;
	struct memory * node = NULL;
	int size = 0;

	intPtr = ((int *)ptr - 1);
	if(* intPtr != BARRIER)
	{
		printf("left barrier overflow\n");
		return;
	}
	
	intPtr--;
	size = * intPtr;

	intPtr--;

	node = *intPtr;

	intPtr = (char *)ptr + size;
	if(* intPtr != BARRIER)
	{
		printf("right barrier overflow\n");
		return;
	}	

	head = ((char *)ptr - 3*sizeof(int)) - sizeof(struct memory *) ;
	free((void *)head);	
	deleteNode(p, node);
}

/* returns number of bytes allocated using MyMalloc/MyFree:
	used as a debugging tool to test for memory leaks */
int AllocatedSize()
{
	int size = 0;
	struct memory * node;
	node = p;
	while(node != NULL)
	{
		size += node->size;
		node = node->next;
	}
	return size;
}



/* Optional functions */

/* Prints a list of all allocated blocks with the
	filename/line number when they were MALLOC'd */
void PrintAllocatedBlocks() {
	struct memory *node = p;
	while (node != NULL)
	{
		printf("Allocated:%d\nfilename:%s\nlineNo:%d\nsize:%d\n",
			node->checkCode, node->filename, node->lineNo, node->size);
		node = node->next;
	}
	return;
}

/* Goes through the currently allocated blocks and checks
	to see if they are all valid.
	Returns -1 if it receives an error, 0 if all blocks are
	okay.
*/
int HeapCheck() {
	return 0;
}
 
分享到:
评论

相关推荐

    arm内存管理单元

    "ARM 内存管理单元" ARM 内存管理单元(Memory Management Unit,MMU)是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU 通常是 CPU 的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表,此...

    内存管理单元简介

    ### 内存管理单元(MMU)详解 #### MMU的历史背景与起源 早期计算机系统由于内存容量较小,不足以支持大型程序的运行。随着技术的进步和应用需求的增长,开发者们面临了一个重大挑战:如何让大型程序在有限的内存...

    MMU内存管理单元

    ### MMU内存管理单元 #### 引言及背景 在早期计算机时代,受限于技术水平,计算机内存容量普遍较小,往往以KB(千字节)为单位。因此,当时的软件程序规模也相应较小,使得有限的内存空间足以承载这些程序的运行。...

    arm mmu内存管理单元手册

    ARM内存管理单元(MMU)是ARM架构中用于处理内存地址转换、内存保护和缓存管理的关键组件。ARM MMU的具体实现和功能细节在《ARM® System Memory Management Unit Architecture Specification》文档中有详尽的描述,...

    MMU内存管理单元原理介绍

    ### MMU内存管理单元原理详解 #### 一、MMU概览 MMU(Memory Management Unit,内存管理单元)是现代计算机系统中的一个重要组成部分,它主要负责管理虚拟存储器和物理存储器之间的映射关系,并确保正确的地址转换...

    x86内存管理单元的简介

    x86内存管理单元的简介,具有权威性,大家快下载啊!

    申延超_嵌入式Linux应用开发完全手册笔记_内存管理单元MMU

    《申延超_嵌入式Linux应用开发完全手册笔记_内存管理单元MMU》是一部深入探讨嵌入式系统中Linux应用开发与内存管理单元(Memory Management Unit, MMU)的著作。作者申延超,凭借丰富的实践经验和理论知识,为我们...

    ARM内存管理单元学习.pptx

    ARM内存管理单元学习 ARM内存管理单元(MMU)是一种硬件组件,负责管理虚拟地址空间与物理地址空间之间的映射关系。在ARM架构中,MMU扮演着至关重要的角色,使得操作系统可以为每个进程提供独立的地址空间。 地址...

    现场总线内存管理单元(FMMU)

    现场总线内存管理单元(FMMU)

    ARM的内存管理单元MMU

    "ARM的内存管理单元MMU" ARM的内存管理单元(MMU)是一种负责虚拟地址到物理地址映射的硬件机制,它提供了硬件机制的内存访问权限检查,确保每个用户进程拥有自己独立的地址空间,并保护每个进程所用的内存不被其他...

    内存管理单元第二季MMU

    内存管理单元(MMU)是嵌入式系统中至关重要的一部分,它负责管理和控制系统的存储资源,尤其是处理不同速度和宽度的存储器件之间的映射关系,如FLASH、SRAM、SDRAM和ROM等。MMU的主要任务是实现虚拟地址到物理地址...

    linux源代码分析之内存管理

    ### Linux源代码分析之内存管理 #### 摘要与关键词 本文档是对Linux内核内存管理系统的一个深入分析,特别是针对其源代码进行了详细的解读。Linux的内存管理是内核中最复杂的部分之一,它涉及到了内存初始化、地址...

    全系统模拟中内存管理单元的模拟实现

    摘要:内存管理单元是体系结构中少数与操作系统进行直接交互的接口之一,其模拟模型的执行效率和扩展能力在全系统模拟环境中尤为重要。本文介绍了SimSoc 全系统模拟框架中内存管理单元的设计思路和基本实现,基于...

    操作系统内存管理的C++模拟

    模拟可变分区内存管理,比较几种不同的分配策略 。。。 释放空间:(1)释放单元前后都被占用,将其插入到当前hole结点后面。(2)仅前一单元为空,直接改变前一单元的size大小和释放单元的尾部,将其并入前一单元。...

    面向通信领域通用内存管理单元的算法和实现

    介绍一种面向通信领域通用内存管理单元的算法和实现方法

    C++内存管理(内存管理、内存泄漏、内存回收)

    "C++内存管理" C++内存管理是指在C++编程语言中,程序员对内存的申请、使用和释放的控制。良好的内存管理是C++程序的核心要素,它可以影响程序的性能、安全性和可靠性。 1. 内存管理的重要性 良好的内存管理是C++...

    ARM芯片S3C2410内存管理单元MMU基础实验.doc

    【ARM芯片S3C2410内存管理单元MMU基础实验】 S3C2410是一款由三星公司生产的基于ARM920T内核的微处理器,它集成了内存管理单元(Memory Management Unit,简称MMU)来实现虚拟地址到物理地址的映射,从而提高系统的...

    内存管理.pdf

    ### 内存管理知识点概述 #### 一、内存的基本概念 - **主存**:即物理内存,是我们常说的RAM的大小,它直接与CPU通信,用于存储正在运行的程序和数据。 - **虚拟内存**:通过操作系统的技术,将硬盘的一部分空间...

    内存管理技术内幕

    - 第一步:MMU(Memory Management Unit, 内存管理单元)首先根据特殊的硬件寄存器(如X86上的CR3或Alpha上的PDR)找到页目录的位置。 - 第二步:MMU根据虚拟地址中的页目录索引定位到页目录中的相应条目,进而获取...

    Linux内存管理编程技术.doc

    在这里,学生被要求观察CR3寄存器,这是一个重要的处理器寄存器,其中存储了当前进程的页全局目录(Page Global Directory)的物理地址,这个目录是内存管理单元(MMU)进行虚拟内存到物理内存映射的关键。...

Global site tag (gtag.js) - Google Analytics