乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      用kprobes實現(xiàn)內核反射機制

       jijo 2008-07-25
      這是 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

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多