kprobe 内核模块

代码来自于linux内核sample/kprobe

kprobe_example.c

/* * NOTE: This example is works on x86 and powerpc. * Here‘s a sample kernel module showing the use of kprobes to dump a * stack trace and selected registers when do_fork() is called. * * For more information on theory of operation of kprobes, see * Documentation/kprobes.txt * * You will see the trace data in /var/log/messages and on the console * whenever do_fork() is invoked to create a new process. */

#include <linux/kernel.h>#include <linux/module.h>#include <linux/kprobes.h>

/* For each probe you need to allocate a kprobe structure */static struct kprobe kp = {    .symbol_name    = "do_fork",};

/* kprobe pre_handler: called just before the probed instruction is executed */static int handler_pre(struct kprobe *p, struct pt_regs *regs){#ifdef CONFIG_X86    printk(KERN_INFO "pre_handler: p->addr = 0x%p, ip = %lx,"            " flags = 0x%lx\n",        p->addr, regs->ip, regs->flags);#endif#ifdef CONFIG_PPC    printk(KERN_INFO "pre_handler: p->addr = 0x%p, nip = 0x%lx,"            " msr = 0x%lx\n",        p->addr, regs->nip, regs->msr);#endif#ifdef CONFIG_MIPS    printk(KERN_INFO "pre_handler: p->addr = 0x%p, epc = 0x%lx,"            " status = 0x%lx\n",        p->addr, regs->cp0_epc, regs->cp0_status);#endif

    /* A dump_stack() here will give a stack backtrace */    return 0;}

/* kprobe post_handler: called after the probed instruction is executed */static void handler_post(struct kprobe *p, struct pt_regs *regs,                unsigned long flags){#ifdef CONFIG_X86    printk(KERN_INFO "post_handler: p->addr = 0x%p, flags = 0x%lx\n",        p->addr, regs->flags);#endif#ifdef CONFIG_PPC    printk(KERN_INFO "post_handler: p->addr = 0x%p, msr = 0x%lx\n",        p->addr, regs->msr);#endif#ifdef CONFIG_MIPS    printk(KERN_INFO "post_handler: p->addr = 0x%p, status = 0x%lx\n",        p->addr, regs->cp0_status);#endif}

/* * fault_handler: this is called if an exception is generated for any * instruction within the pre- or post-handler, or when Kprobes * single-steps the probed instruction. */static int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr){    printk(KERN_INFO "fault_handler: p->addr = 0x%p, trap #%dn",        p->addr, trapnr);    /* Return 0 because we don‘t handle the fault. */    return 0;}

static int __init kprobe_init(void){    int ret;    kp.pre_handler = handler_pre;    kp.post_handler = handler_post;    kp.fault_handler = handler_fault;

    ret = register_kprobe(&kp);    if (ret < 0) {        printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);        return ret;    }    printk(KERN_INFO "Planted kprobe at %p\n", kp.addr);    return 0;}

static void __exit kprobe_exit(void){    unregister_kprobe(&kp);    printk(KERN_INFO "kprobe at %p unregistered\n", kp.addr);}

module_init(kprobe_init)module_exit(kprobe_exit)MODULE_LICENSE("GPL");

makefile 如下:

obj-m := kprobe-example.o KDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default:    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modulesclean:    rm -f *.mod.c *.ko *.o

su root

insmod kprobe-example.ko

cat /var/log/messages 查看消息

lsmod | grep krpobe

rm kprobe-example.ko

时间: 2024-10-10 10:42:45

kprobe 内核模块的相关文章

哎呀,发现自己不会用模块的方式用kprobe啊,弱爆了

一直以来,用kprobe比较多的是kprobe event的用法,之前用过模块的方式编译过kprobe,但是感觉比较麻烦啊 今天要看看怎么用模块的方法简单编译kprobe: 如何单独编译内核模块 http://blog.sina.com.cn/s/blog_9011bd8c01015ms7.html 这个说得还是比较清楚,但是有几个东西还是不清楚呢,比如make设置了源码的目录,那么内核里面的数据结构他是怎么知道的呢? 1 obj-m := kprobe_example.o 2 obj-m +=

Linux 内核模块设计

一.  内核模块 1.  头文件 Linux/init.h  和 Linux/module.h 2.  装载内核 insmod  对应的转载函数 module_init(); 3.  卸载内核 rmmod  对应的卸载函数 module_exit(); 二.  编写 helloworld.c 三.编写Makefile 四 .  把 helloworld.ko 移到Part3/rootfs 打开开发板下载. 直接运行Uboot insmod 挂载一下 helloworld.ko lsmod   查

内核模块

linux内核:单内核+内核模块 内核/boot/vmlinuz-version 模块/lib/modules/version/....ko 用户访问监控内核:/proc /sys /proc/sys/可用来改变内核运行参数 echo "gentoo" > /proc/sys/kernel/hostname sysctl -w kernel.hostname="gentoo"立即生效,不能永久有效 /etc/sysctl.conf设置永久有效->sysc

linux内核模块开发

一,内核模块功能: 让内核文件(zImage或bzImage)本身并不包含某组件,而是在该 组件需要被使用的时候,动态地添加到正在运行的内核中 二,内核模块安装和卸载加载:insmod (insmod hello.ko)卸载:rmmod (rmmod hello)查看:lsmod加载:modprobe (modprobe hello)modprobe如同insmod,也是加载一个模块到内核.它的不同之处在于它会根据文件/lib/modules/<$version>/modules.dep来查看

内核模块编译实验

1.实验原理 Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率很高,但可扩展性和可维护性相对较差,模块机制可弥补这一缺陷. Linux模块可以通过静态或动态的方法加载到内核空间,静态加载是指在内核启动过程中加载:动态加载是指在内核运行的过程中随时加载. 一个模块被加载到内核中时,就成为内核代码的一部分.模块加载入系统时,系统修改内核中的符号表,将新加载的模块提供的资源和符号添加到内核符号表

《linux内核设计与分析》内核模块编程

内核模块编程 一.准备工作 虚拟机:VMware Workstation 12操作系统:ubuntu当前内核版本:linux-headers-4.4.0-22-generic 二.有关于内核模块的知识 模块是具有独立功能的程序,它可以被单独编译,但不能独立运行.它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的.模块通常由一组函数和数据结构组成,用来实现一种文件系统.一个驱动程序或其他内核上层的功能. 内核模块的相关指令: 查看内核版本 uname –a 模块

3、Linux内核模块学习

一.内核模块的学习   内核的整体框架是非常的大,包含的组件也是非常多,如何将需要的组件包含在内核中呢?选择一,就是将所有的组件全部编译进内核,虽然需要的组件都可以使用,但是内核过分庞大,势必带来效率影响:选择二是,将组件编译为模块,需要的时候,就自行加载进内核,这种就是我们称之为的模块,当模块被加载到内核的机制,不仅控制了内核大小,同时被加载的内核与被编译进内核的部分,功能意义.    3.1.内核的加载与卸载     将 hello.c 编译为模块,hello.ko, insmod hell

Linux内核模块编写详解

内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统,本文给大家介绍linux内核模块编写,需要的朋友可以参考下 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统.浮点运算做起来可不容易,堆栈固定而狭小,而你写的代码总是异步的,

Ubuntu 编译安装 Linux 4.0.5 内核,并修复 vmware 网络内核模块编译错误

. . . . . 今天把 Ubuntu 14.04 升级到了最新的 4.0.5 的内核版本,本来不打算记录下来的,但是升级的过程中确实遇到了一些问题,所以还是记录下来,分享给遇到同样问题的猿友. 先去官网下载最新的内核压缩包:https://www.kernel.org/ 网速不给力,只能用虚拟机里的迅雷下载,然后再拷贝出来. LZ 把源码包拷贝到 /usr/src 下面,直接就在这里编译安装了: # 切换到 root 身份 >$ su # 解压缩源码,得到文件夹 /usr/src/linux