2014-11-22 4 views
0

몇 주 동안 프로젝트 작업을하고 있었고 꽤 중요한 장애물에 부딪혔습니다. 여기 누군가가 지침을 제공 할 수 있기를 바랍니다.리눅스 커널에서 프로세스의 가상 메모리 영역에 매핑 된 파일의 파일 이름을 찾는 방법이 있습니까?

내가해야할 일은 호출시 프로세스의 가상 주소 공간 통계를보고하는 시스템 호출을 작성하는 것입니다. 이러한 통계는 할당 기준에 따라 프로세스의 가상 주소 공간 크기, 각 가상 메모리 영역의 액세스 권한 및 이러한 가상 메모리 영역에 매핑 된 파일의 이름을 포함해야합니다.

내가 연구 한 첫 두 작품은 적어도 내 연구와 시도가 지금까지 보여준 것부터 가능하지는 않은 것으로 보인다. 나는 그것을 프로세스의 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; 
} 
+0

이 스레드를 살펴보십시오. http://stackoverflow.com/questions/8250078/how-can-i-get-a-filename-from-a-file-descriptor-inside-a-kernel-module – askb

+0

여기까지입니다. 나는 시작했다. 필자는 솔루션 제안을 구현하려고했지만 files_struct 파일의 출처 또는 파일의 연결 방법을 모릅니다. 그리고 솔루션을 구현하려고 할 때 작성된대로 아무 것도 출력 할 수 없었습니다. – MrMagoo22

답변

1

나는 비슷한 상황에 처해 있었고, 스스로 찾아야했다. 여기에 오는 다른 사람들이 제 대답으로 도움이되기를 바랍니다.

그래서 나는 pmap 명령 출력의 "Mapping"열에 해당하는 값을 원한다고 가정합니다. (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입니다 따릅니다. 꽤 예뻐 보이지 않지만 일을합니다.