访问进程的vm区域

时间:2013-03-13 02:51:21

标签: memory module kernel memory-address virtual-address-space

我正在尝试编写一个必须从进程中读取vm区域地址的LKM。我正在使用pid_task()来获取指向task_struct的指针,但是当我尝试使用它来获取vmarea的起始地址时,我会收到编译错误。

struct task_struct *ts;
ts = pid_task(find_vpid(pid_t)pid,PIDTYPE_PID);
printk(KERN_INFO "%lu",ts->mm->mmap->start);

我收到错误"错误:解除指向不完整类型的指针"

我是一名Linux noob,在LKM中是一名完全的菜鸟。

我很感激任何帮助。

谢谢大家

1 个答案:

答案 0 :(得分:0)

我在我的内核源代码树(2.6.35)上测试了以下代码,编译是okey:

struct task_struct *ts;
pid_t pid;

ts = pid_task(find_vpid(pid),PIDTYPE_PID);
printk(KERN_INFO "%lu",ts->mm->mmap->vm_start);

您可以尝试使用内核源代码树中的上述代码吗?我想也许您必须包含所需的所有头文件,例如:

#include <asm/uaccess.h>
#include <linux/errno.h>
#include <linux/time.h>
#include <linux/proc_fs.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/capability.h>
#include <linux/file.h>
#include <linux/fdtable.h>
#include <linux/string.h>
#include <linux/namei.h>
#include <linux/mnt_namespace.h>
#include <linux/mm.h>
#include <linux/swap.h>
#include <linux/rcupdate.h>
#include <linux/kallsyms.h>
#include <linux/stacktrace.h>
#include <linux/resource.h>
#include <linux/module.h>
#include <linux/mount.h>
#include <linux/security.h>
#include <linux/ptrace.h>
#include <linux/tracehook.h>
#include <linux/cgroup.h>
#include <linux/cpuset.h>
#include <linux/audit.h>
#include <linux/poll.h>
#include <linux/nsproxy.h>
#include <linux/oom.h>
#include <linux/elf.h>
#include <linux/pid_namespace.h>
#include <linux/fs_struct.h>

另:

编译成功后,你应该判断指针是否为NULL。