了解access_process_vm linux内核?
问题描述:
我正在编写一个读取进程虚拟内存部分的内核模块。我试图在内核中使用access_process_vm方法,但它总是读取0个字节。了解access_process_vm linux内核?
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);
我在做什么错?
答
我没有看到有什么问题跟踪下来。
让我们来看看第2失效模式在access_process_vm本身:
if (addr + len < addr)
return 0;
您计算基于vm_end和vm_start的LEN,但是看了你的地址开始。有什么差异?也许你最终失败了这个检查?
mm = get_task_mm(tsk);
if (!mm)
return 0;
这个怎么样?如果没有mm,会怎么样?
依此类推。
另请注意,您正在返回-1而不是实际的错误。您错误地泄漏了对目标线程的引用。