用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...