分配記憶體 get free page

2021-09-10 22:21:31 字數 835 閱讀 7982

如果模組需要分配大塊的記憶體,使用頁面的分配技術會更好一些。

unsigned long get_zeroed_page(gfp_t gfp_mask)
返回指向新頁面的指標並將頁面清零。

unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);
用於以gfp_mask分配方式分配2的order次方個連續的物理頁,並返回指向該區域第乙個位元組的指標。不清零頁面。

gfp_mask掩碼和kmalloc一樣。

order有最大值,可能是10或者11,這依賴於系統。

還有更為簡潔的巨集__get_free_page,如下

#define __get_free_page(gfp_mask) \

__get_free_pages((gfp_mask), 0)

有分配就有釋放,以下是釋放頁面的函式:

#define free_page(addr) free_pages((addr), 0)

void free_pages(unsigned long addr, unsigned int order);

釋放同樣是乙個函式和乙個簡化後的巨集。如果試圖釋放和先前分配數目不等的頁面,記憶體對映關係就會被破壞,隨後系統就會出錯。

值得強調的是,只要符合和kmalloc同樣的規則,get_free_pages和其他函式可以在任何時間呼叫。某些情況下函式分配記憶體時會失敗,特別是在使用gfp_atomic的時候。因此,呼叫了這些函式的程式在分配出錯時都應提供相應的處理。

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...

記憶體分配 定長記憶體分配器

在各種記憶體分配演算法中,有一種很實用,實現起來也簡單 定長的記憶體分配器。即每次分配的記憶體大小是固定的。大概邏輯是 在一些區域性的單執行緒邏輯中,可以有效提高效率。很短,很容易看懂 fallocator.h pragma once 固定長度的記憶體分配器 include include incl...

靜態記憶體分配和 動態記憶體分配

1 靜態記憶體分配是在編譯時完成的,不需要占用cpu資源 動態分配記憶體是在執行時完成的,動態記憶體的分配與釋放需要占用cpu資源 2 靜態記憶體分配是在棧上分配的,動態記憶體是堆上分配的 3 動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要 4 靜態分配記憶體需要在編譯前確定記憶...