我已经在一个项目上工作了几个星期,但遇到了一个相当大的障碍,我希望这里有人可以提供一些指导。
我需要做的就是编写一个系统调用,在调用时报告进程虚拟地址空间的统计信息。根据分配标准,这些统计信息需要包括进程的虚拟地址空间大小、每个虚拟内存区域的访问权限以及映射到这些虚拟内存区域的文件名。
前两个我已经在工作,最后一个似乎是不可能的,至少从我目前的研究和尝试来看是这样。我已经将它隔离到访问进程的 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,这是映射文件的名称。看起来不太漂亮,但可以完成工作。
关于linux - 有没有办法在linux内核中找到映射到进程虚拟内存区域的文件的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27073225/