linux - 有没有办法在linux内核中找到映射到进程虚拟内存区域的文件的文件名?

标签 linux file linux-kernel virtual-memory

我已经在一个项目上工作了几个星期,但遇到了一个相当大的障碍,我希望这里有人可以提供一些指导。

我需要做的就是编写一个系统调用,在调用时报告进程虚拟地址空间的统计信息。根据分配标准,这些统计信息需要包括进程的虚拟地址空间大小、每个虚拟内存区域的访问权限以及映射到这些虚拟内存区域的文件名。

前两个我已经在工作,最后一个似乎是不可能的,至少从我目前的研究和尝试来看是这样。我已经将它隔离到访问进程的 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/

相关文章:

linux - 可以设置虚拟地址空间限制吗?

java - 文件已删除,但实际文件并未删除。 (听起来不对)

linux-kernel - 重启后如何检测内核 panic

c - 在 insmod 之后不同意符号 symbol_name 的版本

c - 如何读取文件并将其正确打印在数组中?

c - 内核模块内存访问

java - WrapperBeanGenerator 错误 : Not creating ASM Type for type

linux - 在 Linux 中将相关数据行分组到单个列中

linux - 在 CentOS_7 1908 上使用 FMXLinux 时出现错误

java - 用逗号显示下载文件的百分比