時間:2018-08-19 00:00:00 來源:信盈達 作者:信盈達
1. 首先先認識下幾個分配內存的接口函數:
l rbuff = kmalloc(len + 4, GFP_KERNEL)
GFP_KERNEL是flag,可以通過該flag來設定分配內存的方式,目前這個GFP_KERNEL就是可以睡眠的,優先級普通;如果是GFP_ATOMIC則優先級高,是原子的,不能睡眠. 通過kfree(rbuff)來釋放
l rbuff = vmalloc(len)
類似于kmalloc,只不過kmalloc分配的內存不管是虛擬地址還是物理地址都是連續的;而vmalloc分配的只是在虛擬地址是連續的,在物理地址上不一定是連續的,所以在需要一張表來建立虛擬地址和分散物理地址的關系,這樣就會使效率降低很多,所以一般這個接口用于要分配大內存時。
l data = devm_kzalloc(&dev,sizeof(struct fts_ts_data), GFP_KERNEL)
這個接口是具有資源管理的kzalloc()。使用資源管理(resource-managed)函數分配的內存,是會與所屬設備相關聯。當設備從系統中分離或者設備驅動被卸載,該內存會被自動釋放。也可以通過devm_kfree()來釋放內存。Struct device dev;
2.slab分配器
l 當頻繁申請小內存,要頻繁進出內存,那這樣就會造成系統消耗較大,所以就設計了slab相當于高速緩存,slab分成三種狀態:滿的slab、部分滿的slab、空的slab;當下一次需要分配內存時會先去看slab里面是否有滿足條件的,如果沒有就創建一個新的slab。當調用kmalloc時就會先去看slab是否有滿足條件的(在kmalloc ->__kmalloc—>__do_kmalloc有這么一句__find_general_cachep(size, flags)就是找是否有滿足條件的?----是對的-12.20);
l 上面的最后講的不知道對不對,另外,如果需要頻繁創建很多相同類型的對象,那么就應該考慮使用高速緩存,步驟如下:
a. 內核函數 kmem_cache_create 用來創建一個新緩存。這通常是在內核初始化時執行的,或者在首次加載內核模塊時執行。
b. 要從一個命名的緩存中分配一個對象,可以使用 kmem_cache_alloc 函數。調用者提供了從中分配對象的緩存以及一組標志:
voidkmem_cache_alloc( struct kmem_cache *cachep, gfp_t flags= GFP_KERNEL );
c. 最后不用了一定要記得釋放掉- kmem_cache_free
通過a、b兩步就可以創建一個具體對象structftp的高速緩存,如果后面要經常創建和釋放struct fts分配的空間,用這個就不用頻繁的申請釋放內存,大大的提高效率
3. 用戶空間和內核空間
l 首先這兩個空間是通過權限來劃分,這樣可以更好的保護數據,應用程序處在用戶空間,與硬件直接打交道的內核核心程序處在內核空間,這樣就可以避免應用程序非法訪問內核、硬件,必須按照內核的規定來。
l 二者總共4G,0-3G是用戶空間,3-4G是內核空間,那為什么只有4G?為什么內核空間在高地址?這里的4G指的是虛擬內存?
答:
問題一:因為我們平時用的機器一般是32位的,32位地址線能索引的最大內存量是4G=2^10×2^10×2^10×2^2(2^10=1k);
問題二:內核是為應用服務的, 將內核放到 較高的線性空間,是為了方便 應用 程序 從0開始使用線性地址空間。
問題三:4G指的是虛擬內存,在實際的物理空間,內核空間還是從地址0開始,只不過在物理內存映射到虛擬內存時采用了偏移量,二者大小比例的劃分是可以更改的。

信盈達2008年在深圳特區南山高新科技園成立。自成立至今近九年來專注為企業和個人提供高端方案設計、高端嵌入式/Android培訓等服務。公司下設信盈達實訓學院、信盈達研發中心、信盈達教學儀器三大業務板塊。九年來公司堅持"技術領先、服務領先",以雄厚的實力和專業的品質成為國內唯一有實力從產品最底層研發到系統層開發的嵌入式實訓、產品解決方案提供商。為中國IT行業提供最具價值的職業教育服務。專業培訓嵌入式、物聯網、人工智能、Java、單片機等課程,想了解更多信息點擊立馬咨詢
免費領取試聽卡
申請已經提交
老師會馬上給您安排試聽課程!
申請出錯了
您可以加老師QQ:914865590報名咨詢!