krealloc 原始碼分析

2021-07-27 13:08:07 字數 1204 閱讀 1825

kernel 中提供了乙個函式krealloc,這個函式可以重新申請一塊memory,但是會將原來memory中的內容copy過來,比較適合

0 size 陣列的問題.

其使用舉例如下:

fwspec = krealloc(dev->iommu_fwspec, size, gfp_kernel);

第乙個引數是需要擴大size的指標,以陣列為例的話,就是陣列頭指標,第二個是要申請的size,第三個要申請的flag,例如這裡就是gfp_kernel

void *krealloc(const void *p, size_t new_size, gfp_t flags)

ret = __do_krealloc(p, new_size, flags);

if (ret && p != ret)

kfree(p);

return ret;

}在krealloc 中首先判斷size是否為0,

if (unlikely(!new_size))

這個條件一般不成立,所以這裡用unlikely修飾.繼續呼叫__do_krealloc

static __always_inline void *__do_krealloc(const void *p, size_t new_size,

gfp_t flags)

ret = kmalloc_track_caller(new_size, flags);

if (ret && p)

memcpy(ret, p, ks);

return ret;

}在__do_krealloc 通過ksize得到原來memory的size,如果原本的size大於要申請的size,那就沒有必要申請了,直接返回原指標就可以了

至於kasan_krealloc 如果沒有定義config_kasan ,則是空的,這個一般用於debug是否踩memory

static inline void kasan_krealloc(const void *object, size_t new_size,

gfp_t flags) {}

繼續往下就是呼叫kmalloc_track_caller 來申請memory,其中kmalloc_track_caller 就是加了debug 資訊的kmalloc,申請到memroy後,就通過memcpy將原來

memory裡面的內容copy到新的memory裡面.

最後返回新的指標ret

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...