kmalloc() 申請的記憶體位於物理記憶體對映區域,而且在物理上也是連續的,它們與真實的實體地址
只有乙個固定的偏移,因為存在較簡單的轉換關係,所以對申請的記憶體大小有限制,不能超過128kb。
較常用的 flags(分配記憶體的方法):
gfp_atomic —— 分配記憶體的過程是乙個原子過程,分配記憶體的過程不會被(高優先順序程序或中斷)打斷;
gfp_kernel —— 正常分配記憶體;
gfp_dma —— 給 dma 控制器分配記憶體,需要使用該標誌(dma要求分配虛擬位址和實體地址連續)。
flags 的參考用法:
|– 程序上下文,可以睡眠 gfp_kernel
|– 程序上下文,不可以睡眠 gfp_atomic
| |– 中斷處理程式 gfp_atomic
| |– 軟中斷 gfp_atomic
| |– tasklet gfp_atomic
|– 用於dma的記憶體,可以睡眠 gfp_dma | gfp_kernel
|– 用於dma的記憶體,不可以睡眠 gfp_dma |gfp_atomic
對應的記憶體釋放函式為:
void kfree(const void *objp);
kmalloc時基於slab分配器來實現的,其分配的物理記憶體時連續的,但是kmalloc一次分配的記憶體不能太大,現在說vmalloc,vmalloc分配的虛擬記憶體時連續的,其分配的區間為記憶體初始化時分配的從vmalloc_start到vmalloc_end區間,分配的虛擬記憶體時以page_size對齊的:
void *vmalloc(unsigned long size)
vmalloc函式的呼叫關係為:
vmalloc()->__vmalloc_node_flags()->__vmalloc_node()->__vmalloc_node_range():
計算機基礎 記憶體
在多道程式環境下,要使程式執行,必須建立程序,而建立程序就要將程式和資料裝入記憶體。乙個使用者源程式要變為在記憶體中可執行的程式,通常要進行以下處理 裝入 由裝入程式將裝入模組裝入記憶體。可重定位裝入 多個程式的起始位址都從0開始,程式中的其他位址都是相對於起始位址的。裝入時將目標程式中的指令和資料...
計算機基礎 計算機記憶體的基本結構
目錄 在這張圖中,介紹了記憶體的儲存結構,分別是 data stored in data segment int x 100 intmain heap 堆 bss segment data segment text segment 在上述 中,已經有了詳細的注釋每個資料儲存到了 但是仍有幾點要說明一...
計算機記憶體的組織方式
計算機使用記憶體來容納要執行的程式以及這些程式使用的資料。作業系統和 執行時 通常將用於容納資料的記憶體劃分為兩個獨立的區域,每個區域都一不同的方式管理,這兩個區域通常稱為棧和堆。棧和堆的設計目標完全不同。呼叫方法時,它的引數和區域性變數所需的記憶體總是從棧中獲取。方法結束後,要不正常返回,要不就丟...