一个项目上工作了几个星期了,我遇到了一个相当大的障碍,我希望这里有人能够提供一些指导。
我需要做的就是编写一个系统调用,在调用时报告进程虚拟地址空间的统计信息。根据分配条件,这些统计信息需要包括进程虚拟地址空间的大小、每个虚拟内存区域的访问权限以及映射到这些虚拟内存区域的文件的名称。
前两个我正在工作,最后一个似乎是不可能的,至少从我的研究和尝试到目前为止的情况来看是这样。我已经将其隔离为在进程vm_area_struct内访问vm_file结构并使用它来获取f_path,但过去我仍然坚持如何从那里获得一种实际上可以放入 printk 语句的格式,当我最终重新编译内核时,我尝试的所有内容都没有输出任何内容。
这是代码目前所在的位置。我甚至走在正确的轨道上吗?
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/mm_types.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/path.h>
#include <linux/dcache.h>
asmlinkage int sys_project3a1(unsigned int processID)
{
struct task_struct *task;
for_each_process(task)
{
if (task->pid == processID)
{
unsigned long virtualAddressSpace = 0;
struct vm_area_struct *vmlist;
printk("Process ID: %d", task->pid);
for (vmlist = task->mm->mmap; vmlist!=NULL; vmlist=vmlist->vm_next)
{
unsigned long space = vmlist->vm_end - vmlist->vm_start;
char *tmp;
char *pathname;
struct file *file;
struct path *path;
printk("Process Access Permissions: %lu", (unsigned long)(vmlist->vm_page_prot.pgprot));
file = vmlist->vm_file;
path = &file->f_path;
path_get(path);
tmp = (char *)__get_free_page(GFP_TEMPORARY);
pathname = d_path(path, tmp, PAGE_SIZE);
printk("Path Name: %s", pathname);
free_page((unsigned long)tmp);
virtualAddressSpace += space;
}
printk("Process Virtual Address Space: %lu", virtualAddressSpace);
}
}
return 1;
}
我遇到了类似的情况,必须自己找到这个。希望其他来到这里的人从我的回答中受益。
所以我假设你想要对应于pmap
命令输出的"映射"列的值。以下内容对我有用(在v4.6.4上尝试):
char filename[50];
if(vmlist->vm_file){
strcpy(filename, vmlist->vm_file->f_path.dentry->d_iname);
}
else{ // implies an anonymous mapping i.e. not file backup'ed
strcpy(filename, "[ anon ]");
}
到达路径后,按照它的 dentry 字段进行操作,然后d_iname映射文件的名称。看起来不太漂亮,但可以完成工作。
结构vm_area_struct *vas;
vas->vm_file->f_path.dentry->d_name.name