資料介紹
一、內存管理簡介
內存管理,是指軟件運行時對計算機內存資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,并且在適當的時候釋放和回收內存資源。內存管理的實現方法有很多種,他們其實最終都是要實現 2 個函數:malloc 和 free;malloc 函數用于內存申請,free 函數用于內存釋放。本章,我們介紹一種比較簡單的辦法來實現:分塊式內存管下面我們介紹一下該方法的實現原理,如圖
內存管理表的項值代表的意義為:當該項值為 0 的時候,代表對應的內存塊未被占用,當該項值非零的時候,代表該項對應的內存塊已經被占用,其數值則代表被連續占用的內存塊數。比如某項值為 10,那么說明包括本項對應的內存塊在內,總共分配了 10 個內存塊給外部的某個指針。內寸分配方向如圖所示,是從頂到底的分配方向。即首先從最末端開始找空內存。當內存管理剛初始化的時候,內存表全部清零,表示沒有任何內存塊被占用。
二、分配原理
當指針 p 調用 malloc 申請內存的時候,先判斷 p 要分配的內存塊數(m),然后從第 n 項開始,向下查找,直到找到 m 塊連續的空內存塊(即對應內存管理表項為 0),然后將這 m 個內存管理表項的值都設置為 m(標記被占用),最后,把最后的這個空內存塊的地址返回指針 p,完成一次分配。注意,如果當內存不夠的時候(找到最后也沒找到連續的 m 塊空閑內存),則返回 NULL 給 p,表示分配失敗。
三、釋放原理
當 p 申請的內存用完,需要釋放的時候,調用 free 函數實現。free 函數先判斷 p 指向的內存地址所對應的內存塊,然后找到對應的內存管理表項目,得到 p 所占用的內存塊數目 m(內存管理表項目的值就是所分配內存塊的數目),將這 m 個內存管理表項目的值都清零,標記釋放,完成一次內存釋放。
四、部分驅動函數
//內存池(32字節對齊)
__align(32) u8 mem1base[MEM1_MAX_SIZE]; //內部SRAM內存池
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));//外部SRAM內存池
//內存管理表
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //內部SRAM內存池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000 MEM2_MAX_SIZE)));//外部SRAM內存池MAP
//內存管理參數
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE};//內存表大小
const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE};//內存分塊大小
const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE};//內存總大小
//內存管理控制器
struct _m_mallco_dev mallco_dev=
{
my_mem_init, //內存初始化
my_mem_perused,//內存使用率
mem1base,mem2base,//內存池
mem1mapbase,mem2mapbase,//內存管理狀態表
0,0, //內存管理未就緒
};
//復制內存
//*des:目的地址
//*src:源地址
//n:需要復制的內存長度(字節為單位)
void mymemcpy(void *des,void *src,u32 n)
{
u8 *xdes=des;
u8 *xsrc=src;
while(n--)*xdes =*xsrc ;
}
//設置內存
//*s:內存首地址
//c :要設置的值
//count:需要設置的內存大小(字節為單位)
void mymemset(void *s,u8 c,u32 count)
{
u8 *xs = s;
while(count--)*xs =c;
}
//內存管理初始化
//memx:所屬內存塊
void my_mem_init(u8 memx)
{
mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//內存狀態表數據清零
mymemset(mallco_dev.membase[memx], 0,memsize[memx]);//內存池所有數據清零
mallco_dev.memrdy[memx]=1;//內存管理初始化OK
}
//獲取內存使用率
//memx:所屬內存塊
//返回值:使用率(0~100)
u8 my_mem_perused(u8 memx)
{
u32 used=0;
u32 i;
for(i=0;i {
if(mallco_dev.memmap[memx][i])used ;
}
return (used*100)/(memtblsize[memx]);
}
//內存分配(內部調用)
//memx:所屬內存塊
//size:要分配的內存大小(字節)
//返回值:0XFFFFFFFF,代表錯誤;其他,內存偏移地址
u32 my_mem_malloc(u8 memx,u32 size)
{
signed long offset=0;
u32 nmemb; //需要的內存塊數
u32 cmemb=0;//連續空內存塊數
u32 i;
if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//未初始化,先執行初始化
if(size==0)return 0XFFFFFFFF;//不需要分配
nmemb=size/memblksize[memx]; //獲取需要分配的連續內存塊數
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 基于Memcached的緩存資源集中管理方法_郭棟
- 一種基于重疊社區檢測的TAL管理方法 5次下載
- 深度解析STM32單片機JTAG的復用方法資料下載
- STM32各種頭文件No such file or directory的解決方法資料下載
- 總結:維修電路板七種方法資料下載
- 經驗總結:這個方法可以解決60%的EMI問題資料下載
- STM32F030_LED詳細配置總結資料下載
- STM32調試485(sp3485)技術總結資料下載
- STM32總結:NVIC是什么?中斷有多少類型?資料下載
- STM32 經驗總結,這些你都知道嗎資料下載
- STM32電源管理及低功耗設計要點資料下載
- 基于線段樹的內存管理方法 2次下載
- EDA工程建模及其管理方法研究2 0次下載
- 材料技術管理方法在汽車生產管理中的應用
- 網絡中常用的隊列管理方法比較
- Linux內核內存管理架構解析 539次閱讀
- STM32串口發送數據和接收數據方式總結 6565次閱讀
- Linux內存管理體系介紹 1459次閱讀
- 使用memheap內存管理算法對片內RAM和片外SDRAM進行管理的方法 3121次閱讀
- 單片機如何對內存進行管理 1.7w次閱讀
- 智能電能表雙控制器的數據管理方法 1149次閱讀
- 【新專利介紹】集中抄表系統采集器及電表資產編號搜集管理方法 3254次閱讀
- 兩種常見的內存管理方法:堆和內存池 1.3w次閱讀
- 內存管理課程5節課的總結說明 1.3w次閱讀
- 一文解析STM32內存管理和堆棧的認知與理解 1.7w次閱讀
- STM32內存管理以及STM32中的堆棧 1.2w次閱讀
- Linux資料匯總之內存管理 4328次閱讀
- LWIP內存管理知識匯總 6773次閱讀
- 詳細圖文剖析STM32單片機串口一鍵下載電路與操作方法 4.6w次閱讀
- 直流穩壓電源制作及管理方法詳解 1.1w次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多