




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、內(nèi)存分配函數(shù)用法小結(jié)作者:武漢華嵌嵌入式培訓(xùn)中心技術(shù)部一、用戶空間內(nèi)存分配:malloc、calloc、realloc1、malloc原型如下:extern void *malloc(unsigned int num_bytes);功能:分配長度為num_bytes字節(jié)塊。工作機(jī)制:malloc函數(shù)的實(shí)質(zhì)體現(xiàn)在,它有一個將可用的內(nèi)存塊連接為一個長長的列表的 所謂空閑鏈表。調(diào)用malloc函數(shù)時,它沿連接表尋找一個大到足以滿足用戶請 求所需要的內(nèi)存塊。然后,將該內(nèi)存塊一分為二(一塊的大小與用戶請求的大小 相等,另一塊的大小就是剩下的字節(jié))。接下來,將分配給用戶的那塊內(nèi)存?zhèn)鹘o 用戶,并將剩下的那塊
2、(如果有的話)返回到連接表上。2、calloc原型如下:void *calloc( un sig ned n,un sig ned size);功能:在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為size的連續(xù)空間3、realloc原型如下: exter n void *realloc(void *mem_address, un sig ned int n ewsize);功能:先按照newsize指定的大小分配空間,將原有數(shù)據(jù)從頭到尾拷貝到新分配的內(nèi)存 區(qū)域,而后釋放原來mem_address所指內(nèi)存區(qū)域,同時返回新分配的內(nèi)存區(qū)域的 首地址。即重新分配存儲器塊的地址。注意:malloc和calloc的區(qū)
3、別:calloc在動態(tài)分配完內(nèi)存后,自動初始化該內(nèi)存空間為零,而malloc不初始化, 里邊數(shù)據(jù)是隨機(jī)的垃圾數(shù)據(jù)。realloc 注意事項:a、realloc 失敗的時候,返回 NULLb、realloc失敗的時候,原來的內(nèi)存不改變,不會釋放也不會移動。c、 假如原來的內(nèi)存后面還有足夠多剩余內(nèi)存的話,realloc的內(nèi)存等于原 來的內(nèi)存加上剩余內(nèi)存,realloc 還是返回原來內(nèi)存的地址;假如原來的內(nèi)存后 面沒有足夠多剩余內(nèi)存的話,realloc將申請新的內(nèi)存,然后把原來的內(nèi)存數(shù)據(jù) 拷貝到新內(nèi)存里,原來的內(nèi)存將被free掉,realloc 返回新內(nèi)存的地址。d、如果size為0,效果等同于fr
4、ee()。e、傳遞給realloc 的指針必須是先前通過malloc(), calloc(), 或 realloc()分配的。f、傳遞給realloc 的指針可以為空,等同于 malloc 。以上三者的事例代碼如下:#i nclude <stdio.h>#i nclude <malloc.h>#include <string.h>int main()/最好每次內(nèi)存申請都檢查申請是否成功/下面這段僅僅作為演示的代碼沒有檢查char *pt1;char *pt2;char *pt3;pt1 = (char *)malloc(sizeof(char)*10);pr
5、in tf("pt1 = %pn", pt1);/以下可能會輸出亂碼,說明malloc分配的空間沒有被初始化為0prin tf("%sn", pt1);scan f("%s", pt1);pt2 = (char *)calloc(10 ,sizeof(char);prin tf("pt2 = %pn", pt2);/以下輸出為空,說明calloc分配的空間被初始化為0prin tf("%sn", pt2);pt3 = (char *)realloc(pt1, sizeof(char)*20);
6、prin tf("pt3 = %pn", pt3);/以下輸出pt1中原先的內(nèi)容。prin tf("%sn", pt3);/以下是釋放申請的內(nèi)存空間free(pt2);free(pt3);return 0;、內(nèi)核空間內(nèi)存分配:kmalloc、vmalloc對于提供了 MM(存儲管理器,輔助操作系統(tǒng)進(jìn)行內(nèi)存管理,提 供虛實(shí)地址轉(zhuǎn)換等硬件支持)的處理器而言,Linux提供了復(fù)雜的存儲管理系統(tǒng), 使得進(jìn)程所能訪問的內(nèi)存達(dá)到 4GB進(jìn)程的4GB內(nèi)存空間被人為的分為兩個部分-用戶空間與內(nèi)核空間。用戶空間地 址分布從 0 到 3GB(PAGE_OFFSE在 0x86
7、 中它等于 OxCOOOOOOO), 3GB到 4GB為 內(nèi)核空間。從前面的介紹已經(jīng)看出,這兩個函數(shù)所分配的內(nèi)存都處于內(nèi)核空間,即從3GB-4GB但位置不同,kmalloc()分配的內(nèi)存處于3GLhigh_memory之間,這一段 內(nèi)核空間與物理內(nèi)存的映射對應(yīng),而 vmalloc()分配的內(nèi)存在vmalloc_start4GB之間,這一段連續(xù)內(nèi)存區(qū)映射到物理內(nèi)存也可能是非連續(xù) 的。vmalloc()工作方式與kmalloc()類似,其主要差別在于前者分配的物理地 址無需連續(xù),而后者確保頁在物理上是連續(xù)的(虛地址自然也是連續(xù)的)。盡管僅僅在某些情況下才需要物理上連續(xù)的內(nèi)存塊,但是,很多內(nèi)核代碼都
8、調(diào)用kmalloc(),而不是用vmalloc()獲得內(nèi)存。這主要是出于性能的考慮。vmalloc() 函數(shù)為了把物理上不連續(xù)的頁面轉(zhuǎn)換為虛擬地址空間上連續(xù)的頁,必須專門建立頁表項。還有,通過vmalloc()獲得的頁必須一個一個的進(jìn)行映射(因?yàn)樗鼈兾?理上不是連續(xù)的),這就會導(dǎo)致比直接內(nèi)存映射大得多的緩沖區(qū)刷新。因?yàn)檫@些原因,vmalloc()僅在絕對必要時才會使用一一典型的就是為了獲得大塊內(nèi)存時, 例如,當(dāng)模塊被動態(tài)插入到內(nèi)核中時,就把模塊裝載到由vmalloc()分配的內(nèi)存上。kamlloc函數(shù)原型:#i ncludevli nu x/slab.h> void *kmalloc(s
9、ize_t size, int flags);(1)第一個參數(shù)是要分配的塊的大小第二個參數(shù)是分配標(biāo)志(flags ),他提供了多種kmalloc的行為vamlloc函數(shù)原型:#i nclude <li nu x/vmalloc.h>void *vmalloc( un sig ned long size);(1)第一個參數(shù)是要分配的塊的大小我們用下面的程序來演示kmalloc和vmalloc的區(qū)別:#i nclude <li nu x/module.h>#i nclude <li nu x/slab.h>#i nclude <li nu x/vmallo
10、c.h>MODULE_LICENSE("GPL");un sig ned char *kmallocmem;un sig ned char *vmallocmem;int _init mem_module_i nit(void)/最好每次內(nèi)存申請都檢查申請是否成功/下面這段僅僅作為演示的代碼沒有檢查kmallocmem = (un sig ned char*)kmalloc(100, 0); prin tk("<1>kmallocmem addr=%x", kmallocmem); vmallocmem = (un sig ned ch
11、ar*)vmalloc(1000000); prin tk("<1>vmallocmem addr=%x", vmallocmem); return 0;void _exit mem_module_exit(void)kfree(kmallocmem);vfree(vmallocmem);modulenit(mem_module_i nit);module_exit(mem_module_exit);總結(jié):a、kmalloc和vmalloc分配的是內(nèi)核的內(nèi)存,malloc 分配的是用戶的內(nèi)存。b、 kmalloc保證分配的內(nèi)存在物理上是連續(xù)的,kmalloc()
12、 分配的內(nèi)存在OxBFFFFFFQOxFFFFFFF以上的內(nèi)存中,driver 一般是用它來完成對 DS的分配, 更適合于類似設(shè)備驅(qū)動的程序來使用。c、 vmalloc保證的是在虛擬地址空間上的連續(xù),vmalloc()則是位于物理地址非 連續(xù),虛地址連續(xù)區(qū),起始位置由 VMALLOL_START決定,一般作為交換區(qū)、模 塊的分配。d、 kmalloc能分配的大小有限,vmalloc 和malloc能分配的大小相對較大(因?yàn)?vmalloc還可以處理交換空間)。e、 內(nèi)存只有在要被DMA&問的時候才需要物理上連續(xù),vmalloc比kmalloc要 慢。f、vmalloc使用的正確場合是分配一大塊,連續(xù)的,只在軟件中存在的,用于 緩沖的內(nèi)存區(qū)域。不能在微處理器之外使用。g、 vmal
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年軸用直爪卡簧鉗行業(yè)深度研究分析報告
- 街區(qū)調(diào)研改造報告
- 【可行性報告】2025年污水泵相關(guān)項目可行性研究報告
- 2024-2025學(xué)年高中化學(xué)專題2.1烷烴和烯烴含解析選修5
- 2024-2025學(xué)年高中化學(xué)第3章第2節(jié)第1課時金屬晶體教案魯科版選修3
- 智能建筑分部工程監(jiān)理評估報告
- 2020-2025年中國氯化鉀緩釋片行業(yè)發(fā)展?jié)摿Ψ治黾巴顿Y戰(zhàn)略咨詢報告
- 2025年顯示屏用發(fā)光管項目投資可行性研究分析報告
- 中國鐵路線路管理行業(yè)市場全景評估及發(fā)展前景預(yù)測報告
- 2025年中國工業(yè)低壓變頻器行業(yè)市場運(yùn)行態(tài)勢與投資戰(zhàn)略咨詢報告
- 越野車改裝方案
- 修辭手法在計算機(jī)語言學(xué)中的應(yīng)用
- 裝修施工規(guī)定(十四篇)
- 消防工程維保方案三篇
- 高考一輪復(fù)習(xí)《文學(xué)類文本閱讀(小說)》教案
- 空間向量求線面角
- 閱讀與思考圓錐曲線的光學(xué)性質(zhì)及其應(yīng)用課件
- 試產(chǎn)到量產(chǎn)項目轉(zhuǎn)移清單
- 城市軌道交通應(yīng)急處理 01 城市軌道交通應(yīng)急處理概述-2
- 2023年全國中學(xué)生物理競賽預(yù)賽試題含答案版
- 葛傳椝向?qū)W習(xí)英語者講話
評論
0/150
提交評論