//內部sram記憶體池 32位元組對齊 說明一次取出32位元組 效率高__align(32)u8 mem1base[mem1_max_size];
_**_align(32)** u8 mem2base[mem2_max_size]attribute((at(0x68000000)));
//記憶體管理引數 //這幾個陣列中存放的是 記憶體表和記憶體池大小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]=; //記憶體表大小const u32 memblksize[srambank]=; //記憶體分塊大小
const u32 memsize[srambank]=;
struct
_m_mallco_dev
;
struct _m_mallco_dev mallco_dev=
;
//記憶體管理初始化
//memx:所屬記憶體塊
void my_mem_init(u8 memx)
void mymemset(void *s,u8 c,u32 count)
記憶體分配函式 malloc(mem_addr,size)
malloc函式返回的是具體位址
所以必須找到連續size大小的記憶體 並且返回這塊連續記憶體的首位址
方法:從尾部開始查詢以32位元組一塊為單位 一塊一塊的向前移動 直到找到連續的結束所以首先將size/32+size%32得到需要多少塊
從記憶體管理表尾部開始找把記憶體管理表管理的塊數給 offset偏移量 然後offset– 直到找到連續塊跳出迴圈
找到後別忘了把管理表相應的塊置1標記已經在使用
管理表置0表示未使用
//記憶體分配(內部呼叫)//memx:所屬記憶體塊
//size:要分配的記憶體大小(位元組)
//返回值:0xffffffff,代表錯誤;其他,記憶體偏移位址
u32 my_mem_malloc(u8 memx,u32 size)
//這不是二維陣列 因為memmap[memx]=陣列首位址
return (offset*memblksize[memx]);//返回偏移位址
}}
return
0xffffffff
;//未找到符合分配條件的記憶體塊
}
記憶體管理單元MMU實驗
mmu介紹 許可權管理 當我們使用windows時,有時候會彈出位址訪問錯誤,但這不影響整個作業系統的執行。假設a b程式的時序圖如下 因為a b程式的位址空間各不相同。許可權管理就使得a程式無法訪問b程式的位址。如果a程式寫的非常糟糕,a程式並不能破壞核心。假如有兩個hello.c檔案,如圖 這兩...
記憶體管理筆記
mrc手動記憶體管理 1.系統不會去檢查已釋放的物件,也就是說,當乙個物件的引用計數為0時,這個物件此時再呼叫其方法不會報錯,成為野指標 除非開啟殭屍除錯診斷,一旦開啟殭屍診斷就會發現崩潰。2.當把這個物件賦值為nil時,成為空指標 再呼叫其方法,將不會出錯,更不會崩潰。3.dealloc方法必須含...
實驗四 uC OS II 的記憶體管理
實驗四 uc os ii 的記憶體管理 一 實驗目的 掌握嵌入式實時作業系統 uc os ii 記憶體管理中記憶體分配和 的功能。二 實驗原理 注意 根據程式中設定的時間延遲,圖中的每個柵格對應100個系統時鐘週期。為了防止記憶體申請和釋放的不合理導致的大塊連續記憶體被分割成可用性小的小片的問題,u...