出手无招

出手无招

0个粉丝

12

问答

0

专栏

0

资料

出手无招  发布于  2019-09-28 17:06:35
采纳率 0%
12个问答
1503

内存管理

 
本帖最后由 anwafs 于 2019-10-10 09:03 编辑


#ifndef BUDDYSYSTEM_H
#define BUDDYSYSTEM_H

#ifdef __cplusplus
extern "C" {
#endif

#include
#include
#include
#include

typedef enum
{
        v_BUDDY_MEM_TYPE_MMZ = 0,
        v_BUDDY_MEM_TYPE_OS,
        v_BUDDY_MEM_TYPE_MAX
}v_BuddyMemType;

/* Buddy System 分配的内存地址 */
typedef struct v_BuddyMem
{
        Int8    *pVirMem;        /* 伙伴系统返回的虚拟地址 */
        Sizet   pPhyAddr;        /* 伙伴系统返回的物理地址,os内存无效 ,mmz有效 */
        Int8   memType;
        Int8    res[3];
        Uint32  res1[32];
}v_BuddyMem;
typedef struct v_BuddyNode
{
        struct v_BuddyNode *prelink;   /* 指向前驱节点 */
        Int32    tag;                /* 块标志,0空闲,1占用 */
        Int32    kval;               /* 块大小,值为2的kval次幂 */
        struct v_BuddyNode *nextlink;  /* 头部域,指向后继节点 */
        Sizet  phyAddr;              /* userSpace的物理地址 */
        Int8   *userSpace;           /* 用户可用地址 */
}v_BuddyNode;

typedef struct v_BuddySets
{
        Uint32     memSize;          /* 伙伴系统总内存大小, memSize = blockSize * 2~blockNum */
        Uint32     blockSize;        /* 每块内存大小 */
        Int16      memType;          /* 内存类型,mmz or os,参考v_BuddyMemType */
        Int16      blockNum;         /* 此值描述内存块个数,总个数为2的blockNum次幂,例 num = 7,则总个数为2的7次方 */
        Sizet      pBasePhyAddr;     /* 待管理地址的物理地址 */
        Int8       *pUserMem;        /* 待管理内存的虚拟地址 */
        Int8       beCache;          /* 只对mmz内存有效,内存是否为cache,0:否 1:是 */
        Int8       res0[3];
        Int32      res[32];
}v_BuddySets;
typedef struct
{
        v_BuddyNode    *pNodeStart; /* 内存模块的起点 */
        v_BuddyNode    *pNodeEnd;   /* 内存模块的终点 */
        v_BuddySets    params;          /* 内存模块参数 */
        OSAL_MutexHandle lock;
}v_BuddySys;
typedef struct v_BuddyHeadNode
{
        Int32           nodesize; /* 该链表的空闲块大小 */
        v_BuddyNode   *first;   /* 该链表的表头指针 */
        v_BuddySys     vBuddySys; /* 存放该内存模块的整体信息 */
}v_BuddyHeadNode;

Int32  v_buddyInit(v_BuddySets *pSets, v_BuddyHeadNode **pBuddyHeadNode);

Int32  v_buddyDeinit(v_BuddyHeadNode *pBuddyHeadNode);

Int32 v_buddyAlloc(v_BuddyHeadNode *pBuddyHeadNode, Uint32 size, v_BuddyMem *pBuddyMem);

Int32 v_buddyReclaim(v_BuddyHeadNode *pBuddyHeadNode, v_BuddyMem *pBuddyMem);

void v_buddyPrintLayout(v_BuddyHeadNode *pBuddyHeadNode);

Int32 v_buddyGetMmzPoolId(v_BuddyHeadNode *pBuddyHeadNode, Int32 *pPoolId);

Int32 v_buddyFlushMem(v_BuddyHeadNode *pBuddyHeadNode, v_BuddyMem *pBuddyMem);
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区