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

2022-05-18 03:55:49 字數 1975 閱讀 5996

2020-05-23

關鍵字:kmalloc、kzalloc、kcalloc

kmalloc() 是linux核心開發中最常使用的申請記憶體的函式。它的原型如下所示:

#include void *kmalloc(size_t size, int flags);

函式的返回值通常就指向所申請到的記憶體空間的起始位址。當然,有時它也會指向 null--如果記憶體的申請出於某些原因失敗的話。

引數 1 表示要申請的空間大小,單位是位元組。size_t 其實就是個 unsigned int 的別名。

引數 2 表示申請記憶體時的模式。這個模式有很多個可選型別,它們均宣告於 中。雖然在 gfp.h 中有眾多可選型別,但其實最常用的也就兩個值:

1、gfp_kernel

這個標誌表示當核心中的可用記憶體不足時,呼叫者,即發起當前申請請求的程序將會被強制進入休眠狀態以等待有足夠的記憶體可供申請為止。也正因為這個標誌有可能導致呼叫程序的休眠,這個標誌只被允許在「程序上下文」中使用。「中斷上下文」如果要休眠的話是會引發錯誤的。

2、gfp_atomic

核心會額外地將一部分記憶體劃分出來以專供於原子性的空間申請使用。簡單來說,使用這個標誌就是有記憶體時就給你分配,沒有就直接以失敗告終,它不會讓你的程序進入休眠態的。

需要注意的是:以上的標頭檔案貼出的僅僅是標準linux核心中的宣告。不同版本、用途的linux核心可能會有不同的宣告結構,這些需要各位同學自行確認。

以下是乙個使用 kmalloc() 函式申請記憶體的小例項:

struct

person;

int__init m_init()

kzalloc()函式其實不需要介紹。因為它在本質上就是 kmalloc() 函式,只不過多了乙個自動幫我們把所申請到的記憶體清零的操作而已。

我們直接看一下這個函式的原型宣告就了然了。這個函式位於 標頭檔案中:

/*

* * kzalloc - allocate memory. the memory is set to zero.

* @size: how many bytes of memory are required.

* @flags: the type of memory to allocate (see kmalloc). */

static inline void *kzalloc(size_t size, gfp_t flags)

既然如此,kzalloc() 的示例**就沒有必要貼了。 

kcalloc()函式的本質也是 kmalloc() 函式。它相較於 kzalloc() 函式又多了一層「數量」的封裝。閒話少說,直接看下它的原型:

/*

* * kcalloc - allocate memory for an array. the memory is set to zero.

* @n: number of elements.

* @size: element size.

* @flags: the type of memory to allocate (see kmalloc). */

static inline void *kcalloc(size_t n, size_t size, gfp_t flags)

kmalloc_array()函式的原型如下:

static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags)

繞了一圈,又是 kmalloc() 的封裝。既然如此,就沒有貼示例**的必要了。

前面貼了三種記憶體空間申請的函式,它們在本質上都是同乙個函式 kmalloc() 的封裝。

因此,通常來說,要釋放申請的記憶體都可以用同乙個函式來完成:

#incclude void kfree(const

void *);

12 記憶體空間的申請

使用者空間記憶體的申請函式為 malloc,相對應的記憶體釋放函式為 free。malloc 函式具備一下的記憶體能力 1 二次管理的的能力 當使用者空間 malloc 了一塊記憶體,這塊被申請的記憶體被立即 free 之後,並不會立即將這塊記憶體還給核心,而是將這塊記憶體還給了 c 庫,這塊記憶體...

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

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

Linux核心空間記憶體申請函式

前言 我們都知道在使用者空間申請記憶體的函式是malloc 這個函式在各個作業系統上的使用是一致的,對應的使用者空間的記憶體釋放韓式是free 那麼在核心空間中記憶體如何申請呢?一般我們會用到kmalloc kzalloc vmalloc alloc page 等,下面我們來詳細看一下他們的各個引數...