12 記憶體空間的申請

2022-09-03 11:42:12 字數 1126 閱讀 7886

使用者空間記憶體的申請函式為 malloc,相對應的記憶體釋放函式為 free。malloc 函式具備一下的記憶體能力

(1)二次管理的的能力

當使用者空間 malloc 了一塊記憶體,這塊被申請的記憶體被立即 free 之後,並不會立即將這塊記憶體還給核心,而是將這塊記憶體還給了 c 庫,這塊記憶體還是屬於這個程序,只是將這塊記憶體交給 c 庫去進行管理。因此後續的記憶體申請,就可以占用這塊被釋放的記憶體了。

(2)linux 核心總是按需分配

當 malloc 成功之後,返回。雖然是成功返回,但是核心並沒有將這塊記憶體真正給程序,這個時候,如果去讀的話,會發現內容全部是零,而且這個記憶體也是唯讀的。當在寫這個記憶體的時候,核心會在出現頁錯誤的時候,真正把這塊記憶體給這個程序。

void * kmalloc(size, flags)

size ,分配記憶體大小。flags,分配的標誌,一般較為常用的是 gfp_kernel,gfp_aromic。

kmalloc 申請的記憶體,位於 dma對映區,最重要的是,物理上,也是連續的,它們與真是的實體地址只有乙個固定的便宜。這一點對 dma 至關重要。

kmalloc 分配記憶體空間的大小,一般是比較的小,大小為 128kb-16b。

當 flags 是 gfp_kernel 的時候,若是申請記憶體空間的請求不被滿足,則程序就會睡眠,引起阻塞。所以,標誌為 gfp_kernel 的話,就不能出現在中斷的上下文,自旋鎖,或者原子操作中。所以,在中斷的上下文, ,tasklet、核心的定時器,等不能出現程序切換的位置中,就只能使用 gfp_atomic 去申請記憶體,若是此時申請不到的話,就不等待睡眠了,直接進行返回。、 

使用 kfree 去釋放申請的記憶體空間。

vmalloc 使用方法類似,但是 vmalloc 一般是用於申請記憶體空間較大的應用場景,而且,vmalloc 申請的記憶體空間,只在虛擬記憶體空間上是連續的,但是實質上,在物理記憶體空間並不一定連續。所以,申請的虛擬位址空間和實際的實體地址空間更沒有固定的偏移關係。

vmalloc 內部的實現,是借助了 gfp_kernel 標誌的 kmalloc 去實現的,所以,vmalloc 也是不能用在原子的上下文。

同理,使用 vfree 去進行記憶體的釋放。

malloc 到底如何申請記憶體空間?

malloc 到底從 得到了記憶體空間?答案是從堆裡面獲得空間。也就是說函式返回的指標是指向堆裡面的一塊記憶體。作業系統中有乙個記錄空閒記憶體位址的鍊錶。當作業系統收到程式的申請時,就會遍歷該鍊錶,然後就尋找第乙個空間大於所申請空間的堆結點,然後就將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給...

Linux核心下記憶體空間的申請

2020 05 23 關鍵字 kmalloc kzalloc kcalloc kmalloc 是linux核心開發中最常使用的申請記憶體的函式。它的原型如下所示 include void kmalloc size t size,int flags 函式的返回值通常就指向所申請到的記憶體空間的起始位址...

結構體內存對齊 申請釋放記憶體空間

指標基礎知識 關於一些不的不知道而且聞所未聞的高中聽都沒聽過的但是讓我支支吾吾的問題 申請空間 釋放空間 零零碎碎的小知識點 學習是為了改變世界,改變自己,改變人生.請善用搜尋 不需要了,我會建立目錄了 近期目標 從下標進化到指標 為了讓自己距離dalao近一點.指標.int pa 乙個整型變數指標...