用kprobes實現核心反射機制

2021-08-22 09:06:58 字數 2387 閱讀 1238

用kprobes實現核心反射機制

作者****:li xianjing

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

)return0;}

static

struct

kretprobe

my_kretprobe

= ;static

int__init

kretprobe_init

(void

)printk(

"planted return probe at %p/n"

, my_kretprobe

.kp.addr);

return0;}

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;insmod 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。

linux-2.6.21/documentation/kprobes.txt

~~end~~

用kprobes實現核心反射機制

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

用js實現打字機效果

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

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

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