[英]Understanding access_process_vm linux kernel?
我正在编写一个内核模块,该模块读取进程的虚拟内存的一部分。 我正在尝试在内核中使用access_process_vm方法,但是它总是最终读取0个字节。
target = get_pid_task(find_get_pid(target_pid),PIDTYPE_PID);
if (target == NULL) {
printk(KERN_ALERT "no such task %d\n",target_pid);
return -1;
}
printk(KERN_INFO "opened task with pid %d\n",target->pid);
len = vm_end-vm_start;
buf = kmalloc(len ,GFP_KERNEL);
if (!buf) {
printk(KERN_ALERT "unable to allocate memory\n");
return -1;
}
printk(KERN_INFO "allocated memory\n");
bytes = access_process_vm(target,addr,buf,len,FOLL_FORCE);
if (bytes != len) {
printk(KERN_ALERT "could only read %d of %ld bytes\n",bytes,len);
kfree(buf);
return -1;
}
printk(KERN_INFO "read %d bytes successfully\n",bytes);
我究竟做错了什么?
我看不出这是什么问题。
让我们看一下access_process_vm本身的前两种故障模式:
if (addr + len < addr)
return 0;
您基于vm_end和vm_start计算len,但是您从addr开始读取。 差异如何? 也许您最终未能通过此检查?
mm = get_task_mm(tsk);
if (!mm)
return 0;
这个怎么样? 如果没有毫米怎么办?
等等。
另请注意,您将返回-1而不是实际错误。 您正在泄漏对目标线程的错误引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.