Linux kernel 通过模块钩住任意核函数

Linux kernel 通过模块钩住任意核函数,linux-kernel,systems-programming,Linux Kernel,Systems Programming,我正在尝试监视PCIe堆栈向设备写入配置的所有时间。在没有与usbmon等效的PCI的情况下,我想在调用PCI\u总线\u write\u config\u byte()函数的所有时间都进行监视。我想写一个内核模块,基本上做到了这一点: int (*original)(struct pci_bus *, unsigned int, int, u8); original = &pci_bus_write_config_byte; pci_bus_write_config_byte = &a

我正在尝试监视PCIe堆栈向设备写入配置的所有时间。在没有与usbmon等效的PCI的情况下,我想在调用
PCI\u总线\u write\u config\u byte()
函数的所有时间都进行监视。我想写一个内核模块,基本上做到了这一点:

int (*original)(struct pci_bus *, unsigned int, int, u8);
original = &pci_bus_write_config_byte;
pci_bus_write_config_byte = &my_custom_func;
然后我的自定义函数将
printk()
传递任何数据,并返回原始的pci_总线\u write_config_字节。但是,当我加载模块时,什么也没有发生。我怀疑这是由于某种RW保护

我的谷歌搜索显示,
set\u memory\u rw()
应该使函数指针可写,但我无法正确地包含它或使用此函数-当我转到insmod模块时,内核说有未知符号


关于如何做到这一点有什么想法吗?

为什么不使用跟踪所有函数调用到
pci_总线\u写入\u配置\u字节
?我读了一些关于ftrace的指南,但不清楚如何配置它来做到这一点。你能给我一个快速入门吗?我在加载有问题的内核模块时,设置了“pci总线写入配置字节”过滤器,然后执行了“cat跟踪管道”。我知道它确实调用了
pci_总线_write_config_byte
,但没有得到任何输出。我的解决方案是使用systemtap。它基本上类似于Solaris的dtrace,但适用于Linux。如果你能写一篇关于你的解决方案的概述作为答案,下一个遇到类似问题的人会更容易找到答案。