細(xì)說Linux內(nèi)存泄漏檢測實(shí)現(xiàn)原理與實(shí)現(xiàn)_第1頁
細(xì)說Linux內(nèi)存泄漏檢測實(shí)現(xiàn)原理與實(shí)現(xiàn)_第2頁
細(xì)說Linux內(nèi)存泄漏檢測實(shí)現(xiàn)原理與實(shí)現(xiàn)_第3頁
細(xì)說Linux內(nèi)存泄漏檢測實(shí)現(xiàn)原理與實(shí)現(xiàn)_第4頁
細(xì)說Linux內(nèi)存泄漏檢測實(shí)現(xiàn)原理與實(shí)現(xiàn)_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第第頁細(xì)說Linux內(nèi)存泄漏檢測實(shí)現(xiàn)原理與實(shí)現(xiàn)在使用沒有垃圾回收的語言時(如C/(C++)),可能由于忘記釋放內(nèi)存而導(dǎo)致內(nèi)存被耗盡,這叫

內(nèi)存泄漏。由于內(nèi)核也需要自己管理內(nèi)存,所以也可能出現(xiàn)內(nèi)存泄漏的情況。為了能夠找出導(dǎo)致內(nèi)存泄漏的地方,(Linux)內(nèi)核(開發(fā)者)開發(fā)出kmemleak功能。

下面我們來詳細(xì)介紹一下kmemleak這個功能的原理與實(shí)現(xiàn)。

kmemleak原理

首先來分析一下,什么情況會導(dǎo)致

內(nèi)存泄漏。

1.造成內(nèi)存泄漏的原因

內(nèi)存泄漏的根本原因是由于用戶沒有釋放不再使用的動態(tài)申請的內(nèi)存(在內(nèi)核中由

memblock_alloc、kmalloc、vmalloc、kmem_cache_alloc

等函數(shù)申請的內(nèi)存),那么哪些內(nèi)存是不再使用的呢?一般來說,沒有被指針引用(指向)的內(nèi)存都是不再使用的內(nèi)存。因?yàn)檫@些內(nèi)存已經(jīng)丟失了其地址信息,從而導(dǎo)致內(nèi)核不能再使用這些內(nèi)存。

我們來看看下圖的事例:

雖然

create_obiect

函數(shù)的代碼比較長,但是邏輯卻很簡單,主要完成2件事情:

申請一個新的

kmemleak_object

對象,并且初始化其各個字段。

將新申請的

kmemleak_object

對象添加到全局紅黑樹中。

kmemleak_object

對象插入到全局紅黑樹的算法與數(shù)據(jù)結(jié)構(gòu)中的平衡二叉樹算法是一致的,所以不了解的同學(xué)可以查閱相關(guān)的(資料)。

2.內(nèi)存泄漏檢測

當(dāng)開啟內(nèi)存泄漏檢測時,內(nèi)核將會創(chuàng)建一個名為

kmemleak

的內(nèi)核線程來進(jìn)行檢測。

在分析內(nèi)存檢測的實(shí)現(xiàn)之前,我們先來了解一下關(guān)于

kmemleak_object

對象的三個概念:

白色節(jié)點(diǎn):表示此對象沒有被指針引用(count

字段少于

min_count

字段)。

灰色節(jié)點(diǎn):表示此對象被一個或多個指針引用(count

字段大于或等于

min_count

字段)。

黑色節(jié)點(diǎn):表示此對象不需要被掃描(min_count

字段等于-1)。

接著我們來看看

kmemleak

內(nèi)核線程的實(shí)現(xiàn):

static

int

kmemleak_s(can)_thread(void

*arg){

...

while

(!kthread_should_stop())

{

...

kmemleak_scan();

//

進(jìn)行內(nèi)存泄漏掃描

...

}

return

0;}

可以看出

kmemleak

內(nèi)核線程主要通過調(diào)用

kmemleak_scan

函數(shù)來進(jìn)行內(nèi)存泄漏掃描。我們繼續(xù)來看看

kmemleak_scan

函數(shù)的實(shí)現(xiàn):

static

void

kmemleak_scan(void){

...

//

1)

將所有

kmemleak_object

對象的

count

字段置0,表示開始時全部是白色節(jié)點(diǎn)

list_f(or)_e(ac)h_entry_rcu(object,

...

}

...

//

2)

掃描數(shù)據(jù)段與未初始化數(shù)據(jù)段

scan_block(_(sd)ata,

_(eda)ta,

NULL,

1);

scan_block(__bss_start,

__bss_stop,

NULL,

1);

...

//

3)

掃描所有內(nèi)存頁結(jié)構(gòu),這是由于內(nèi)存頁結(jié)構(gòu)也可能引用其他內(nèi)存塊

for_each_online_node(i)

{

...

for

(pfn

=

start_pfn;

pfn

由于

kmemleak_scan

函數(shù)的代碼比較長,所以我們對其進(jìn)行精簡。精簡后可以看出,kmemleak_scan

函數(shù)主要完成5件事情:

將系統(tǒng)中所有

kmemleak_object

對象的

count

字段置0,表示掃描開始時,所有節(jié)點(diǎn)都是白色節(jié)點(diǎn)。

調(diào)用

scan_block

函數(shù)掃描

數(shù)據(jù)段

未初始化數(shù)據(jù)段,因?yàn)檫@兩個區(qū)域可能存在指針。

掃描所有

內(nèi)存頁結(jié)構(gòu),這是因?yàn)閮?nèi)存頁結(jié)構(gòu)可能會引用其他內(nèi)存塊,所以也要對其進(jìn)行掃描。

掃描所有

進(jìn)程內(nèi)核棧,由于進(jìn)程內(nèi)核??赡艽嬖谥羔?,所以要對其進(jìn)行掃描。

掃描所有

灰色節(jié)點(diǎn),由于灰色節(jié)點(diǎn)也可能存在指針,所以要對其進(jìn)行掃描。

掃描主要通過

scan_block

函數(shù)進(jìn)行,我們來看看

scan_block

函數(shù)的實(shí)現(xiàn):

static

voidscan_block(void

*_start,

void

*_end,

struct

kmemleak_object

*scanned,

int

allow_resched){

unsigned

long

*ptr;

unsigned

long

*start

=

PTR_ALIGN(_start,

BY(TE)S_PER_POINTER);

unsigned

long

*end

=

_end

-

(BYTES_PER_POINTER

-

1);

//

對內(nèi)存區(qū)進(jìn)行掃描

for

(ptr

=

start;

ptr

count++;

//

判斷當(dāng)前對象是否灰色節(jié)點(diǎn),如果是將其添加到灰色節(jié)點(diǎn)鏈表中

if

(color_gray(object))

{

list_add_t(ai)l(

...

con(ti)nue;

}

...

}}

scan_block

函數(shù)主要完成以下幾個步驟:

遍歷內(nèi)存區(qū)所有指針。

查找指針?biāo)玫膬?nèi)存塊是否存在于紅黑樹中,如果不存在就跳過處理此對象。

如果

kmemleak_object

對象不是白色,說明已經(jīng)有指針引用此內(nèi)存塊,跳過處理此對象。

kmemleak_object

對象的

count

字段進(jìn)行加一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論