




已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
嵌入式開發(fā)教程之Linux內(nèi)核中常見內(nèi)存分配函數(shù),1.原理說明 多級分頁目錄結(jié)構(gòu) 1.1.伙伴系統(tǒng)算法 1.2.slab分 配器 2.常用內(nèi)存分配函數(shù) 2.1._get_free_pages 2.2.kmem_cache_alloc 2.3.kmalloc 2.4.vmalloc Linux內(nèi)核部分內(nèi)存分布 2.5.dma_alloc_coherent 2.6.ioremap 2.7.Boot Memory 2.7.1.在內(nèi)核引導(dǎo)時分配內(nèi)存 2.7.2.通過內(nèi)核引導(dǎo)參數(shù)預(yù)留頂部內(nèi)存 3.幾種分配函數(shù)的比較,1.嵌入式開發(fā)教程之原理說明,Linux內(nèi)核中采 用了一種同時適用于32位和64位系統(tǒng)的內(nèi) 存分頁模型,對于32位系統(tǒng)來說,兩級頁表足夠用了,而在x86_64系 統(tǒng)中,用到了四級頁表,如圖2-1所示。四級頁表分別為: * 頁全局目錄(Page Global Directory) * 頁上級目錄(Page Upper Directory) * 頁中間目錄(Page Middle Directory) * 頁表(Page Table) 頁全局目錄包含若干頁上級目錄的地址,頁上級目錄又依次包含若干頁中間目錄的地址,而頁中間目錄又包含若干頁表的地址,每一個頁表項指 向一個頁框。Linux中采用4KB大小的 頁框作為標(biāo)準(zhǔn)的內(nèi)存分配單元。,嵌入式開發(fā)教程之多級分頁目錄結(jié)構(gòu),1.1.伙伴系統(tǒng)算法 在實際應(yīng)用中,經(jīng)常需要分配一組連續(xù)的頁框,而頻繁地申請和釋放不同大小的連續(xù)頁框,必然導(dǎo)致在已分配頁框的內(nèi)存塊中分散了許多小塊的 空閑頁框。這樣,即使這些頁框是空閑的,其他需要分配連續(xù)頁框的應(yīng)用也很難得到滿足。 為了避免出現(xiàn)這種情況,Linux內(nèi)核中引入了伙伴系統(tǒng)算法(buddy system)。把所有的空閑頁框分組為11個 塊鏈表,每個塊鏈表分別包含大小為1,2,4,8,16,32,64,128,256,512和1024個連續(xù)頁框的頁框塊。最大可以申請1024個連 續(xù)頁框,對應(yīng)4MB大小的連續(xù)內(nèi)存。每個頁框塊的第一個頁框的物理地址是該塊大小的整數(shù)倍。,嵌入式開發(fā)教程,假設(shè)要申請一個256個頁框的塊,先從256個頁框的鏈表中查找空閑塊,如果沒有,就去512個 頁框的鏈表中找,找到了則將頁框塊分為2個256個 頁框的塊,一個分配給應(yīng)用,另外一個移到256個頁框的鏈表中。如果512個頁框的鏈表中仍沒有空閑塊,繼續(xù)向1024個頁 框的鏈表查找,如果仍然沒有,則返回錯誤。 頁框塊在釋放時,會主動將兩個連續(xù)的頁框塊合并為一個較大的頁框塊。,1.2嵌入式開發(fā)教程之.slab分 配器,slab分配器源于 Solaris 2.4 的 分配算法,工作于物理內(nèi)存頁框分配器之上,管理特定大小對象的緩存,進(jìn)行快速而高效的內(nèi)存分配。 slab分配器為每種使用的內(nèi)核對象建立單獨的緩沖區(qū)。Linux 內(nèi)核已經(jīng)采用了伙伴系統(tǒng)管理物理內(nèi)存頁框,因此 slab分配器直接工作于伙伴系 統(tǒng)之上。每種緩沖區(qū)由多個 slab 組成,每個 slab就是一組連續(xù)的物理內(nèi)存頁框,被劃分成了固定數(shù)目的對象。根據(jù)對象大小的不同,缺省情況下一個 slab 最多可以由 1024個頁框構(gòu)成。出于對齊 等其它方面的要求,slab 中分配給對象的內(nèi)存可能大于用戶要求的對象實際大小,這會造成一定的 內(nèi)存浪費。,2.嵌入式開發(fā)教程之常用內(nèi)存分配函數(shù),2.1._get_free_pages unsigned long _get_free_pages(gfp_t gfp_mask, unsigned int order) _get_free_pages函數(shù)是最原始的內(nèi)存分配方式,直接從伙伴系統(tǒng)中獲取原始頁框,返回值為第一個頁框的起始地址。_get_free_pages在實現(xiàn)上只是封裝了alloc_pages函 數(shù),從代碼分析,alloc_pages函數(shù)會分配長度為1order的 連續(xù)頁框塊。order參數(shù)的最大值由include/linux/Mmzone.h文 件中的MAX_ORDER宏決定,在默認(rèn)的2.6.18內(nèi) 核版本中,該宏定義為10。也就是說在理論上_get_free_pages函 數(shù)一次最多能申請110 * 4KB也就是4MB的 連續(xù)物理內(nèi)存。但是在實際應(yīng)用中,很可能因為不存在這么大量的連續(xù)空閑頁框而導(dǎo)致分配失敗。在測試中,order為10時分配成功,order為11則返回錯誤。,2.2.嵌入式開發(fā)教程之kmem_cache_alloc,struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void*, struct kmem_cache *, unsigned long), void (*dtor)(void*, struct kmem_cache *, unsigned long) void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags),嵌入式開發(fā)教程,kmem_cache_create/ kmem_cache_alloc是基于slab分配器的一種內(nèi)存分配方式,適用于反復(fù)分配釋放同一大小內(nèi)存塊的場合。首先用kmem_cache_create創(chuàng)建一個高速緩存區(qū)域,然后用kmem_cache_alloc從 該高速緩存區(qū)域中獲取新的內(nèi)存塊。 kmem_cache_alloc一次能分配的最大內(nèi)存由mm/slab.c文件中的MAX_OBJ_ORDER宏 定義,在默認(rèn)的2.6.18內(nèi)核版本中,該宏定義為5, 于是一次最多能申請15 * 4KB也就是128KB的 連續(xù)物理內(nèi)存。分析內(nèi)核源碼發(fā)現(xiàn),kmem_cache_create函數(shù)的size參數(shù)大于128KB時會調(diào)用BUG()。測試結(jié)果驗證了分析結(jié)果,用kmem_cache_create分 配超過128KB的內(nèi)存時使內(nèi)核崩潰。,2.3.嵌入式開發(fā)教程之kmalloc,void *kmalloc(size_t size, gfp_t flags) kmalloc是內(nèi)核中最常用的一種內(nèi)存分配方式,它通過調(diào)用kmem_cache_alloc函 數(shù)來實現(xiàn)。kmalloc一次最多能申請的內(nèi)存大小由include/linux/Kmalloc_size.h的 內(nèi)容來決定,在默認(rèn)的2.6.18內(nèi)核版本中,kmalloc一 次最多能申請大小為131702B也就是128KB字 節(jié)的連續(xù)物理內(nèi)存。測試結(jié)果表明,如果試圖用kmalloc函數(shù)分配大于128KB的內(nèi)存,編譯不能通過。,2.4.嵌入式開發(fā)教程之vmalloc,void *vmalloc(unsigned long size) 前面幾種內(nèi)存分配方式都是物理連續(xù)的,能保證較低的平均訪問時間。但是在某些場合中,對內(nèi)存區(qū)的請求不是很頻繁,較高的內(nèi)存訪問時間也 可以接受,這是就可以分配一段線性連續(xù),物理不連續(xù)的地址,帶來的好處是一次可以分配較大塊的內(nèi)存。圖3-1表 示的是vmalloc分配的內(nèi)存使用的地址范圍。vmalloc對 一次能分配的內(nèi)存大小沒有明確限制。出于性能考慮,應(yīng)謹(jǐn)慎使用vmalloc函數(shù)。在測試過程中, 最大能一次分配1GB的空間。,嵌入式開發(fā)教程之Linux內(nèi)核部分內(nèi)存分布,2.5.dma_alloc_coherent void *dma_alloc_coherent(struct device *dev, size_t size, ma_addr_t *dma_handle, gfp_t gfp) DMA是一種硬件機(jī)制,允許外圍設(shè)備和主存之間直接傳輸IO數(shù)據(jù),而不需要CPU的參與,使用DMA機(jī)制能大幅提高與設(shè)備通信的 吞吐量。,嵌入式開發(fā)教程,DMA操作中,涉及到CPU高速緩 存和對應(yīng)的內(nèi)存數(shù)據(jù)一致性的問題,必須保證兩者的數(shù)據(jù)一致,在x86_64體系結(jié)構(gòu)中,硬件已經(jīng)很 好的解決了這個問題, dma_alloc_coherent和_get_free_pages函數(shù)實現(xiàn)差別不大,前者實際是調(diào)用_alloc_pages函 數(shù)來分配內(nèi)存,因此一次分配內(nèi)存的大小限制和后者一樣。_get_free_pages分配的內(nèi) 存同樣可以用于DMA操作。測試結(jié)果證明,dma_alloc_coherent函 數(shù)一次能分配的最大內(nèi)存也為4M。,2.6.嵌入式開發(fā)教程之ioremap,void * ioremap (unsigned long offset, unsigned long size) ioremap是一種更直接的內(nèi)存“分配”方式,使用時直接指定物理起始地址和需要分配內(nèi)存的大小,然后將該段 物理地址映射到內(nèi)核地址空間。ioremap用到的物理地址空間都是事先確定的,和上面的幾種內(nèi)存 分配方式并不太一樣,并不是分配一段新的物理內(nèi)存。ioremap多用于設(shè)備驅(qū)動,可以讓CPU直接訪問外部設(shè)備的IO空間。ioremap能映射的內(nèi)存由原有的物理內(nèi)存空間決定,所以沒有進(jìn)行測試。,2.7.嵌入式開發(fā)教程之Boot Memory,如果要分配大量的連續(xù)物理內(nèi)存,上述的分配函數(shù)都不能滿足,就只能用比較特殊的方式,在Linux內(nèi) 核引導(dǎo)階段來預(yù)留部分內(nèi)存。,2.7.1.嵌入式開發(fā)教程之在內(nèi)核引導(dǎo)時分配內(nèi)存,void* alloc_bootmem(unsigned long size) 可以在Linux內(nèi)核引導(dǎo)過程中繞過伙伴系統(tǒng)來分配大塊內(nèi)存。使用方法是在Linux內(nèi)核引導(dǎo)時,調(diào)用mem_init函數(shù)之前 用alloc_bootmem函數(shù)申請指定大小的內(nèi)存。如果需要在其他地方調(diào)用這塊內(nèi)存,可以將alloc_bootmem返回的內(nèi)存首地址通過EXPORT_SYMBOL導(dǎo) 出,然后就可以使用這塊內(nèi)存了。這種內(nèi)存分配方式的缺點是,申請內(nèi)存的代碼必須在鏈接到內(nèi)核中的代碼里才能使用,因此必須重新編譯內(nèi)核,而且內(nèi)存管理系統(tǒng) 看不到這部分
溫馨提示
- 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年軍隊文職人員招聘之軍隊文職管理學(xué)與服務(wù)全真模擬考試試卷A卷含答案
- 2025年軍隊文職人員招聘之軍隊文職管理學(xué)提升訓(xùn)練試卷B卷附答案
- 新泰數(shù)學(xué)初一試題及答案
- 安全防火知識培訓(xùn)課件
- 2025年黨史競賽知識題庫50題及答案
- 監(jiān)理基礎(chǔ)知識培訓(xùn)課件
- 人工智能醫(yī)療輔助系統(tǒng)應(yīng)用及操作指南
- 唐宋八大家之一王安石介紹與作品欣賞教案
- 公司股份制改革法律文件匯編手冊
- 保險理賠處理流程協(xié)議
- 公路沖擊碾壓應(yīng)用技術(shù)指南
- 安全文明施工獎罰明細(xì)表
- 育英學(xué)校與社區(qū)及家長聯(lián)系制度
- 枯死松樹清理服務(wù)投標(biāo)方案(完整技術(shù)標(biāo))
- 第4課 中古時期的亞洲(教學(xué)課件)-【中職專用】《世界歷史》同步課堂(同課異構(gòu))(高教版2023?基礎(chǔ)模塊)
- 《監(jiān)理企業(yè)安全責(zé)任清單(2.0版)參考模板》
- 小區(qū)停車收費方案
- 《讓我們的家更美好》教學(xué)設(shè)計
- 提升漁業(yè)與水產(chǎn)養(yǎng)殖技術(shù)的高效養(yǎng)殖模式
- 曲率系數(shù)不均勻系數(shù)自動計算
- 垃圾分揀項目可行性報告
評論
0/150
提交評論