繁体   English   中英

了解access_process_vm Linux内核?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM