計算機基礎(六) 記憶體申請方式

2021-09-10 02:56:15 字數 997 閱讀 1038

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 在上述 中,已經有了詳細的注釋每個資料儲存到了 但是仍有幾點要說明一...

計算機記憶體的組織方式

計算機使用記憶體來容納要執行的程式以及這些程式使用的資料。作業系統和 執行時 通常將用於容納資料的記憶體劃分為兩個獨立的區域,每個區域都一不同的方式管理,這兩個區域通常稱為棧和堆。棧和堆的設計目標完全不同。呼叫方法時,它的引數和區域性變數所需的記憶體總是從棧中獲取。方法結束後,要不正常返回,要不就丟...