時間:2018-08-19 00:00:00 來源:信盈達 作者:信盈達
1. 首先先認識下幾個分配內(nèi)存的接口函數(shù):
l rbuff = kmalloc(len + 4, GFP_KERNEL)
GFP_KERNEL是flag,可以通過該flag來設(shè)定分配內(nèi)存的方式,目前這個GFP_KERNEL就是可以睡眠的,優(yōu)先級普通;如果是GFP_ATOMIC則優(yōu)先級高,是原子的,不能睡眠. 通過kfree(rbuff)來釋放
l rbuff = vmalloc(len)
類似于kmalloc,只不過kmalloc分配的內(nèi)存不管是虛擬地址還是物理地址都是連續(xù)的;而vmalloc分配的只是在虛擬地址是連續(xù)的,在物理地址上不一定是連續(xù)的,所以在需要一張表來建立虛擬地址和分散物理地址的關(guān)系,這樣就會使效率降低很多,所以一般這個接口用于要分配大內(nèi)存時。
l data = devm_kzalloc(&dev,sizeof(struct fts_ts_data), GFP_KERNEL)
這個接口是具有資源管理的kzalloc()。使用資源管理(resource-managed)函數(shù)分配的內(nèi)存,是會與所屬設(shè)備相關(guān)聯(lián)。當設(shè)備從系統(tǒng)中分離或者設(shè)備驅(qū)動被卸載,該內(nèi)存會被自動釋放。也可以通過devm_kfree()來釋放內(nèi)存。Struct device dev;
2.slab分配器
l 當頻繁申請小內(nèi)存,要頻繁進出內(nèi)存,那這樣就會造成系統(tǒng)消耗較大,所以就設(shè)計了slab相當于高速緩存,slab分成三種狀態(tài):滿的slab、部分滿的slab、空的slab;當下一次需要分配內(nèi)存時會先去看slab里面是否有滿足條件的,如果沒有就創(chuàng)建一個新的slab。當調(diào)用kmalloc時就會先去看slab是否有滿足條件的(在kmalloc ->__kmalloc—>__do_kmalloc有這么一句__find_general_cachep(size, flags)就是找是否有滿足條件的?----是對的-12.20);
l 上面的最后講的不知道對不對,另外,如果需要頻繁創(chuàng)建很多相同類型的對象,那么就應(yīng)該考慮使用高速緩存,步驟如下:
a. 內(nèi)核函數(shù) kmem_cache_create 用來創(chuàng)建一個新緩存。這通常是在內(nèi)核初始化時執(zhí)行的,或者在首次加載內(nèi)核模塊時執(zhí)行。
b. 要從一個命名的緩存中分配一個對象,可以使用 kmem_cache_alloc 函數(shù)。調(diào)用者提供了從中分配對象的緩存以及一組標志:
voidkmem_cache_alloc( struct kmem_cache *cachep, gfp_t flags= GFP_KERNEL );
c. 最后不用了一定要記得釋放掉- kmem_cache_free
通過a、b兩步就可以創(chuàng)建一個具體對象structftp的高速緩存,如果后面要經(jīng)常創(chuàng)建和釋放struct fts分配的空間,用這個就不用頻繁的申請釋放內(nèi)存,大大的提高效率
3. 用戶空間和內(nèi)核空間
l 首先這兩個空間是通過權(quán)限來劃分,這樣可以更好的保護數(shù)據(jù),應(yīng)用程序處在用戶空間,與硬件直接打交道的內(nèi)核核心程序處在內(nèi)核空間,這樣就可以避免應(yīng)用程序非法訪問內(nèi)核、硬件,必須按照內(nèi)核的規(guī)定來。
l 二者總共4G,0-3G是用戶空間,3-4G是內(nèi)核空間,那為什么只有4G?為什么內(nèi)核空間在高地址?這里的4G指的是虛擬內(nèi)存?
答:
問題一:因為我們平時用的機器一般是32位的,32位地址線能索引的最大內(nèi)存量是4G=2^10×2^10×2^10×2^2(2^10=1k);
問題二:內(nèi)核是為應(yīng)用服務(wù)的, 將內(nèi)核放到 較高的線性空間,是為了方便 應(yīng)用 程序 從0開始使用線性地址空間。
問題三:4G指的是虛擬內(nèi)存,在實際的物理空間,內(nèi)核空間還是從地址0開始,只不過在物理內(nèi)存映射到虛擬內(nèi)存時采用了偏移量,二者大小比例的劃分是可以更改的。
信盈達2008年在深圳特區(qū)南山高新科技園成立。自成立至今近九年來專注為企業(yè)和個人提供高端方案設(shè)計、高端嵌入式/Android培訓(xùn)等服務(wù)。公司下設(shè)信盈達實訓(xùn)學(xué)院、信盈達研發(fā)中心、信盈達教學(xué)儀器三大業(yè)務(wù)板塊。九年來公司堅持"技術(shù)領(lǐng)先、服務(wù)領(lǐng)先",以雄厚的實力和專業(yè)的品質(zhì)成為國內(nèi)唯一有實力從產(chǎn)品最底層研發(fā)到系統(tǒng)層開發(fā)的嵌入式實訓(xùn)、產(chǎn)品解決方案提供商。為中國IT行業(yè)提供最具價值的職業(yè)教育服務(wù)。專業(yè)培訓(xùn)嵌入式、物聯(lián)網(wǎng)、人工智能、Java、單片機等課程,想了解更多信息點擊立馬咨詢
免費領(lǐng)取試聽卡
申請已經(jīng)提交
老師會馬上給您安排試聽課程!
申請出錯了
您可以加老師QQ:914865590報名咨詢!