用kprobes實現核心反射機制

2021-04-13 01:38:20 字數 2879 閱讀 2522

用kprobes實現核心反射機制

作者****:

li xianjing

2007-5-29

前幾天在設計事件管理器時,我就在考慮磁碟滿的問題,磁碟滿是乙個典型的系統事件,沒有什麼好說的,問題是應該何時何地觸發它呢?如果由應用程式在操作檔案時觸發,那將有很多地方需要修改,這不是我們期望的。如果能在乙個地方統一處理,那就省事多了,說到統一處理,我們自然會想到修改

glibc

或者核心的**。

但修改glibc

或者核心的**也非我所願,對於這些標準的軟體包,除非是有

bug,否則我是不情願去修改它們的,特別是加入這種專用功能,因為那讓以後的維護比較麻煩,公升級不方便。最好的辦法就是不用修改**,而動態的改變某些函式的行為。

gcc有乙個選項

-finstrument-functions

,它可以在函式呼叫前後注入指定**,利用這些注入的**來改變函式的行為,這是乙個非常酷的特性,常用作高階的除錯技巧。但我可不想給

glibc

中每乙個函式呼叫都注入**,那可能會對效能造成嚴重的影響。

elf檔案都是由

/lib/ld-linux.so.2

載入的,

ld-linux

提供了一種

preload

機制,它用於優先載入指定的共享庫,可以通過

ld_preload

環境變數或

/etc/preload.conf

配置檔案來指定共享庫。這倒是乙個不錯的方法,在

preload

的共享庫去實現部分檔案操作函式,這樣就可以方便的為這些函式增加新功能了。

今天無意中發現了一種更酷的方法,原來核心提供了一種稱為

kprobes的功能,利用它我們可以很容易實現反射機制,動態的修改某些函式的行為。下面是乙個從linux-2.6.21/documentation/kprobes.txt中抄出來的例子:

kretprobe-example.c

#include

#include

#include

static

const

char

*probed_func

= "sys_open"

;

/* return-probe handler: if the probed function fails, log the return value. */

static

intret_handler

(struct

kretprobe_instance *

ri,

struct

pt_regs *

regs

)

return

0;

}

static

struct

kretprobe

my_kretprobe

= ;

static

int__init

kretprobe_init

(void

)

printk(

"planted return probe at %p/n"

, my_kretprobe

.kp.addr);

return

0;

}

static

void

__exit

kretprobe_exit

(void

)

module_init(

kretprobe_init

)

module_exit(

kretprobe_exit

)

module_license(

"gpl"

);makefile

obj-m := kretprobe-example.o

kdir := /lib/modules/$(shell uname -r)/build

pwd := $(shell pwd)

default:

$(make) -c $(kdir) subdirs=$(pwd) modules

clean:

rm -f *.mod.c *.ko *.o

make之後用inmod插入kretprobe-example.ko:

make;in**od kretprobe-example.ko

再用vim開啟/var/log/messages,可以看到諸如:

may 29 20:35:49 lixj kernel: sys_open returns –2

之類的資訊。

不過,遺憾的是它只支援下面幾個平台,沒有arm版本的實現,讓我白開心了一回。

- i386

- x86_64 (amd-64, em64t)

- ppc64

- ia64 (does not support probes on instruction slot1.)

-sparc64 (return probes not yet implemented.)

更詳細的內容可以閱讀

linux-2.6.21/documentation/kprobes.txt

。參考資源:

用kprobes實現核心反射機制

用kprobes實現核心反射機制 作者 li xianjing 前幾天在設計事件管理器時,我就在考慮磁碟滿的問題,磁碟滿是乙個典型的系統事件,沒有什麼好說的,問題是應該何時何地觸發它呢?如果由應用程式在操作檔案時觸發,那將有很多地方需要修改,這不是我們期望的。如果能在乙個地方統一處理,那就省事多了,...

用js實現打字機效果

1.難得有點時間,回憶下古詩文,順便練習下js,實現下打字機效果 春江花月夜 張若虛 唐 春江潮水連海平,海上明月共潮生。灩灩隨波千萬里,何處春江無月明!江流宛轉繞芳甸,月照花林皆似霰 空裡流霜不覺飛,汀上白沙看不見。江天一色無纖塵,皎皎空中孤月輪。江畔何人初見月?江月何年初照人?人生代代無窮已,江...

用SecureCRT實現真機跟虛擬機器的檔案傳輸

在真機下向linux傳送檔案的方法。首先在真機中安裝securecrt,然後在快速連線中建立乙個到虛擬機器的連線,當然,你要先知道你的系統的ip,在終端中鍵入ifconfig可以檢視到。然後連線即可登陸到linux的終端下 要從虛擬機器傳檔案到真機的話,這需要cd到你要傳的檔案的目錄,然後用命令 s...