這是 Google 對 http://www./html/article/kernel/20070823/6399.html 的緩存。 這是該網(wǎng)頁在 2008年6月27日 05:00:02 GMT 的快照。 當前頁在此期間可能已經(jīng)更改。 了解詳情 »
純文字版本突出顯示以下搜索字詞: python 反射 機制
高級搜索 收藏本站 網(wǎng)站地圖 RSS訂閱 首頁 新聞 Ubuntu Fedora Gentoo Mandriva Slackware Suse 紅旗 LFS C++ JAVA Perl PHP Python Ruby 入門 命令 多媒體 服務器 內核 嵌入式 軟件 SHELL DB2 MySQL Oracle PostgreSQL Sybase 智能模糊搜索 僅搜索標題 熱門關鍵字: ubuntu 分區(qū) linux系統(tǒng)進程 Fedora 函數(shù) 當前位置 :| 主頁>Linux教程>內核研究> 用kprobes實現(xiàn)內核反射機制來源: 作者: 時間:2007-08-23 Tag: 點擊: 32 前幾天在設計事件管理器時,我就在考慮磁盤滿的問題,磁盤滿是一個典型的系統(tǒng)事件,沒有什么好說的,問題是應該何時何地觸發(fā)它呢?如果由應用程序在操作文件時觸發(fā),那將有很多地方需要修改,這不是我們期望的。如果能在一個地方統(tǒng)一處理,那就省事多了,說到統(tǒng)一處理,我們自然會想到修改glibc或者內核的代碼。 但修改glibc或者內核的代碼也非我所愿,對于這些標準的軟件包,除非是有BUG,否則我是不情愿去修改它們的,特別是加入這種專用功能,因為那讓以后的維護比較麻煩,升級不方便。最好的辦法就是不用修改代碼,而動態(tài)的改變某些函數(shù)的行為。
gcc有一個選項-finstrument-functions,它可以在函數(shù)調用前后注入指定代碼,利用這些注入的代碼來改變函數(shù)的行為,這是一個非常酷的特性,常用作高級的調試技巧。但我可不想給glibc中每一個函數(shù)調用都注入代碼,那可能會對性能造成嚴重的影響。
ELF文件都是由/lib/ld-linux.so.2加載的,ld-linux提供了一種PRELOAD機制,它用于優(yōu)先加載指定的共享庫,可以通過LD_PRELOAD環(huán)境變量或/etc/preload.conf配置文件來指定共享庫。這倒是一個不錯的方法,在PRELOAD的共享庫去實現(xiàn)部分文件操作函數(shù),這樣就可以方便的為這些函數(shù)增加新功能了。
今天無意中發(fā)現(xiàn)了一種更酷的方法,原來內核提供了一種稱為kprobes的功能,利用它我們可以很容易實現(xiàn)反射機制,動態(tài)的修改某些函數(shù)的行為。下面是一個從linux-2.6.21/Documentation/kprobes.txt中抄出來的例子:
kretprobe-example.c #include <linux/kernel.h> #include <linux/module.h> #include <linux/kprobes.h> static const char *probed_func = "sys_open"; /* Return-probe handler: If the probed function fails, log the return value. */ static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) { int retval = regs_return_value(regs); if (retval < 0) { printk("%s returns %d\n", probed_func, retval); } return 0; } static struct kretprobe my_kretprobe = { .handler = ret_handler, /* Probe up to 20 instances concurrently. */ .maxactive = 20 }; static int __init kretprobe_init(void) { int ret; my_kretprobe.kp.symbol_name = (char *)probed_func; if ((ret = register_kretprobe(&my_kretprobe)) < 0) { printk("register_kretprobe failed, returned %d\n", ret); return -1; } printk("Planted return probe at %p\n", my_kretprobe.kp.addr); return 0; } static void __exit kretprobe_exit(void) { unregister_kretprobe(&my_kretprobe); printk("kretprobe unregistered\n"); /* nmissed > 0 suggests that maxactive was set too low. */ printk("Missed probing %d instances of %s\n", my_kretprobe.nmissed, probed_func); } 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版本的實現(xiàn),讓我白開心了一回。 - 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。 作者聯(lián)系方式:李先靜 <xianjimli at hotmail dot com> [收藏] [推薦] [評論] [打印] [關閉] 0頂一下上一篇:Linux系統(tǒng)內核分析 使用GDB和QEMU來調試
下一篇:Linux操作系統(tǒng)下編譯支持NTFS的內核模塊 最新評論共有 4 位網(wǎng)友發(fā)表了評論 查看所有評論發(fā)表評論 評論內容:不能超過250字,需審核,請自覺遵守互聯(lián)網(wǎng)相關政策法規(guī)。 用戶名: 密碼: 匿名? 注冊 欄目列表 linux安裝 Linux命令 Linux入門 Shell開發(fā) 編程開發(fā) 多媒體應用 分區(qū)和文件系統(tǒng) 服務器管理 熱點關注深入理解LINUX內核中文版Linux內核下載linux ioctl()函數(shù)全面的framebuffer詳解Linux 2.6 字符設備驅動程Linux重新編譯內核指南linux內核IOCTL網(wǎng)絡控制框Linux編譯內核詳解Linux內核編程實戰(zhàn)經(jīng)驗談Linux 2.6.16 udev問題升級linux內核到2.6.24linux2.6內核下的一個按鍵kmalloc, vmalloc分配的內linux 內核升級和系統(tǒng)引導如何編譯Linux的內核Linux 2.6內核的編譯步驟linux kernel API文檔2.4內核編譯詳解Linux操作系統(tǒng)源代碼詳細Linux操作系統(tǒng)內核中工作 相關文章利用udev、sys動態(tài)創(chuàng)建linLinux內核bootsplash功能Linux下malloc/free與new/電壓不足導致的內核BUG linux 內核調試(二)linux 內核調試(一)機制與策略-內核執(zhí)行機制Linux2.6 內核的 Initrd Linux內核可移植性(一)-Linux內核可移植性(二)- 91Linux! 本文來自: (www.) 詳細出處參考:http://203.208.33.101/search?q=cache:jF1cX0DutRAJ:www./html/article/kernel/20070823/6399.html+python+%E5%8F%8D%E5%B0%84%E6%9C%BA%E5%88%B6&hl=zh-CN&ct=clnk&cd=21&gl=cn&st_usg=ALhdy28ifm_EP2b_DO7wRaBBucVJys_psg |
|