freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

mocor平臺內(nèi)存管理介紹及案例分析(編輯修改稿)

2025-02-05 04:23 本頁面
 

【文章內(nèi)容簡介】 00 //pool39。s block size ? define POOL_A_BLOCK_NUM 98 //pool39。s block number ? define POOL_B_BLOCK_SIZE 1300 //pool39。s block size ? define POOL_B_BLOCK_NUM 10 //pool39。s block number ? define POOL_C_BLOCK_SIZE 1600 //pool39。s block size ? define POOL_C_BLOCK_NUM 12 //pool39。s block number ? (以上的定義不同版本的 MOCOR可能并不一致,經(jīng)常會有調(diào)整 ) 保密信息 . 29 2022/2/6 MOCOR內(nèi)存管理 什么時候在 heap上分配,什么時候在內(nèi)存池上分配? ? MOCOR對分配內(nèi)存的位置有如下的約定:只有分配的內(nèi)存的大小超過 ,內(nèi)存才會在 heap里分配,否則就在內(nèi)存塊池里分配。目前 MOCOR平臺定義的最大的內(nèi)存塊池是 1600字節(jié),也就是大于 1600字節(jié)的內(nèi)存才在 heap里分配。 保密信息 . 30 2022/2/6 MOCOR內(nèi)存管理 ? MOCOR在內(nèi)存池上的分配策略是: ? 最小適配原則:按從小到大的順序,遍歷所有的內(nèi)存池,直到找到一個內(nèi)存池,其大小大于欲分配內(nèi)存的大小,就在該內(nèi)存池分配內(nèi)存。如果該內(nèi)存池已被用盡,則繼續(xù)向下遍歷,找到下一個適合的內(nèi)存池。如果全部遍歷完都沒有找到可用的內(nèi)存池,則改為在 heap上分配內(nèi)存。 ? 上面的策略對于上層的申請者是透明的,申請者只要傳入欲分配的內(nèi)存大小即可,無須關(guān)心內(nèi)存究竟是在哪里分配的。 保密信息 . 31 2022/2/6 MOCOR內(nèi)存管理 ? 系統(tǒng) assert之后,選擇菜單 5,可以看到當前所有 pool的信息,類似這樣: 保密信息 . 32 2022/2/6 MOCOR內(nèi)存管理 ? Debug信息: ? 為了方便在出現(xiàn)內(nèi)存問題的時候調(diào)試,通常在分配內(nèi)存的時候 (heap和 pool),會額外的多分配一個 header,放在每一塊分配內(nèi)存的開始。 header的結(jié)構(gòu)定義如下: ? 結(jié)構(gòu)成員的意義如下: ? pre , succ : 兩個指向 header結(jié)構(gòu)的指針,目的是將所有的 header串成一張雙向鏈表。 ? file_name , line: 分配該塊內(nèi)存的文件名和行號 ? size : 內(nèi)存大小 (不包括 header) ? block_num: 系統(tǒng)分配的內(nèi)存塊總計 ? 此外,為了能檢查內(nèi)存越界,在每一塊分配內(nèi)存的最后也會額外多分配一個字節(jié)做為END FLAG,內(nèi)存分配時該字節(jié)會被寫入 0xAA。當該內(nèi)存被釋放時,會檢查該標志位,如果不為 0xAA,則說明出現(xiàn)異常,系統(tǒng) ASSERT。 保密信息 . 33 2022/2/6 MOCOR內(nèi)存管理 ? 加入 debug信息后的內(nèi)存如下: 分 配 的 內(nèi) 存H e a d e rp r e0 x A As u c cf i l e n a m el i n es i z eB l o c k n u m分 配 的 內(nèi) 存H e a d e r0 x A A保密信息 . 34 2022/2/6 MOCOR內(nèi)存管理 ? 因為有額外加了這些 debug信息,所以如果我們要分配 N個字節(jié)的內(nèi)存,那么實際上分配的大小是 :N + sizeof(MEM_HEADER_T) + 考慮到字節(jié)對齊的需要,實際的空間比上面的數(shù)字可能還要大一點。 ? 比如 16字節(jié)的內(nèi)存池,其中每個內(nèi)存塊的大小其實是: 16 + 24 + 4 (本應(yīng)是加 1,加 4是為了字節(jié)對齊 ) ? Header里的 pre指向前一塊分配的內(nèi)存, next指向后一塊分配的內(nèi)存,所有分配的內(nèi)存,都通過 header里的 pre和 succ指針串起來,構(gòu)成一張雙向鏈表。每分配一塊新的內(nèi)存,就將這塊內(nèi)存的 header加到鏈表的最后。通過遍歷 header構(gòu)成的鏈表,我們可以得到當前所有分配的內(nèi)存塊的信息。 保密信息 . 35 2022/2/6 MOCOR內(nèi)存管理 ? 系統(tǒng) assert之后,選擇菜單 4,就可以打印出這些信息,類似這樣 : 保密信息 . 36 2022/2/6 MOCOR內(nèi)存管理 ? 思考: ? 應(yīng)用里分配一塊大小為 N字節(jié)的內(nèi)存,實際在內(nèi)存里占了多少空間? 保密信息 . 37 2022/2/6 MOCOR內(nèi)存管理 ? 練習(xí): ? 前面我們已經(jīng)講了 MOCOR平臺各類內(nèi)存的分配情況,下面需要你親自動手加深理解。使用我們的樣機,連上 log,主動 assert,輸入3,dump出當前的內(nèi)存。輸入 5,打出當前的內(nèi)存信息。然后打開內(nèi)存 dump文件,找到 app heap的起始地址,從起始地址開始,推出整個 app heap的所有內(nèi)存塊的信息,然后用剛才打印出的信息驗證一下你的推導(dǎo)是否正確。 保密信息 . 38 2022/2/6 MOCOR內(nèi)存管理 ?: ? 內(nèi)存管理的最終的對象就是物理內(nèi)存,但是,物理內(nèi)存并不能全部用于動態(tài)分配,因為一些全局變量,代碼等需要占用物理內(nèi)存,這些相當于靜態(tài)分配。而我們通常說的內(nèi)存管理是指動態(tài)的對內(nèi)存進行分配和釋放。那么哪些物理內(nèi)存是我們能夠動態(tài)分配使用的呢,我們是如何知道可以動態(tài)分配的物理內(nèi)存的地址范圍呢? ? 以 6600L芯片為例, L所用的 NORMCP中的 SRAM通常是 4M,這 4M就是我們所能夠用到的所有物理內(nèi)存。 OS啟動后,會把物理內(nèi)存SRAM的地址映射到 0x04000000到 0x04400000這個區(qū)域。 保密信息 . 39 2022/2/6 MOCOR內(nèi)存管理 Heap和 pool對應(yīng)的物理內(nèi)存的位置和大?。? uint32 pool_1_addr[POOL_XX_SIZE(POOL_1_BLOCK_SIZE, POOL_1_BLOCK_NUM)]。 uint32 pool_2_addr[POOL_XX_SIZE(POOL_2_BLOCK_SIZE, POOL_2_BLOCK_NUM)]。 uint32 pool_3_addr[POOL_XX_SIZE(POOL_3_BLOCK_SIZE, POOL_3_BLOCK_NUM)]。 ……… uint32 pool_B_addr[POOL_XX_SIZE(POOL_B_BLOCK_SIZE, POOL_B_BLOCK_NUM)]。 uint32 pool_C_addr[POOL_XX_SIZE(POOL_C_BLOCK_SIZE, POOL_C_BLOCK_NUM)]。 uint32 BYTE_HEAP_ADDR[ byte_head_size 2 ]。 保密信息
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1