下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GBT 35259-2017 紡織品 色牢度試驗(yàn) 試樣顏色隨照明體變化的儀器評定方法(CMCCON02)》專題研究報(bào)告
- 《GB-T 35484.3-2021土方機(jī)械和移動式道路施工機(jī)械 工地?cái)?shù)據(jù)交換 第3部分:遠(yuǎn)程信息處理數(shù)據(jù)》專題研究報(bào)告
- 《GB-T 24117-2009針織物 疵點(diǎn)的描述 術(shù)語》專題研究報(bào)告
- 《儲能材料與器件分析測試技術(shù)》課件-表面積測試實(shí)訓(xùn)
- 2026年淮南聯(lián)合大學(xué)單招職業(yè)適應(yīng)性考試題庫參考答案詳解
- 《幼兒文學(xué)》課件-8.4幼兒戲劇改編
- 運(yùn)輸公司調(diào)度崗實(shí)習(xí)合同
- 鐘表行業(yè)鐘表品牌營銷專員崗位招聘考試試卷及答案
- 2025城管協(xié)管員筆試題及答案
- 2025年氣浮電主軸項(xiàng)目建議書
- 2025pmp歷年考試真題及答案下載
- 《成人腸道菌群移植的護(hù)理規(guī)范》
- 外包人員安全培訓(xùn)內(nèi)容課件
- 作詞進(jìn)階教學(xué)課件下載
- 燃?xì)庋簿€員安全培訓(xùn)課件
- 生活垃圾分類設(shè)備安裝與調(diào)試方案
- 2025版離婚協(xié)議書樣本:婚姻關(guān)系解除與子女撫養(yǎng)安排
- 政治重點(diǎn)人管理機(jī)制解析
- 電子檔案管理系統(tǒng)基礎(chǔ)知識
- 2025年農(nóng)村宅基地買賣合同書樣本
- 農(nóng)產(chǎn)品產(chǎn)地冷藏保鮮設(shè)施安全生產(chǎn)隱患排查整治表
評論
0/150
提交評論