- 论坛徽章:
- 0
|
利用下面这个例子说我得问题
例子从http://relayfs.sourceforge.net/examples.html得到
直接使用relayfs,
In init/main.c:
#include <linux/relayfs_fs.h>
#define SUBBUF_SIZE 262144
#define N_SUBBUFS 4
struct rchan *kleak_chan = NULL;
static void __init do_basic_setup(void)
{
/* drivers will send hotplug events */
init_workqueues();
usermodehelper_init();
driver_init();
#ifdef CONFIG_SYSCTL
sysctl_init();
#endif
/* Networking initialization needs a process context */
sock_init();
do_initcalls();
kleak_chan = relay_open("kleak", NULL, SUBBUF_SIZE,
N_SUBBUFS, 1, NULL);---------------打开channel
if (!kleak_chan)
printk("kleak channel creation failed\n");
else
printk("kleak channel ready\n");
}
In mm/slab.c:
#include <linux/relayfs_fs.h>
extern struct rchan *kleak_chan;
void *__kmalloc(size_t size, unsigned int __nocast flags)
{
kmem_cache_t *cachep;
void *a;
cachep = __find_general_cachep(size, flags);
if (unlikely(cachep == NULL))
return NULL;
a = __cache_alloc(cachep, flags);
if (kleak_chan) {
char buf[64];
int size = sprintf(buf, "kmalloc: addr %p caller %p, size %d\n",
a, __builtin_return_address(0), size);
relay_write(kleak_chan, buf, size);-------------------------往channel里写数据
}
return a;
}
void kfree(const void *objp)
{
kmem_cache_t *c;
unsigned long flags;
if (unlikely(!objp))
return;
if (kleak_chan) {
char buf[64];
int size = sprintf(buf, "kfree: addr %p caller %p, size %d\n",
objp, __builtin_return_address(0), ksize(objp));
relay_write(kleak_chan, buf, size);-----------------写数据
}
local_irq_save(flags);
kfree_debugcheck(objp);
c = GET_PAGE_CACHE(virt_to_page(objp));
__cache_free(c, (void*)objp);
local_irq_restore(flags);
}
重编译内核挂载mount -t relayfs relayfs /mnt/relay
/mnt/relay目录下 cat kleak能看到数据
我的问题是,现在写个用户程序
代码:
我在别的资料上看到的用法是
fd=open("/mnt/relay/kleak",...);
while(1){
n=read(fd,buf,sizeof(buf));
if(n<0){
close(fd);
break;
}
}
就应该能读出数据了,但这样得出buf得数据是空的
有兴趣的同志试试好了
觉得重编译内核麻烦的话,在模块里定义
channel也是可以的,但你的内核若不支持relayfs就非得重编译了 |
|