2017-05-19 96 views
0

我正在编写一个读取进程虚拟内存部分的内核模块。我试图在内核中使用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); 

我在做什么错?

回答

0

我没有看到有什么问题跟踪下来。

让我们来看看第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而不是实际的错误。您错误地泄漏了对目标线程的引用。