gpt4 book ai didi

linux - 了解 access_process_vm linux 内核?

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:04 25 4
gpt4 key购买 nike

我正在编写一个内核模块,它读取进程的部分虚拟内存。我试图在内核中使用 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 本身的前 2 种故障模式:

   if (addr + len < addr)
return 0;

你根据 vm_end 和 vm_start 计算 len,但是你从 addr 开始读取。差异是怎么回事?也许你最终没有通过这项检查?

   mm = get_task_mm(tsk);
if (!mm)
return 0;

这个怎么样?没有mm怎么办?

等等。

另请注意,您返回的是 -1 而不是实际错误。您正在错误地泄漏对目标线程的引用。

关于linux - 了解 access_process_vm linux 内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44069453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com