2017-05-19 97 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而不是實際的錯誤。您錯誤地泄漏了對目標線程的引用。