몇 주 동안 프로젝트 작업을하고 있었고 꽤 중요한 장애물에 부딪혔습니다. 여기 누군가가 지침을 제공 할 수 있기를 바랍니다.리눅스 커널에서 프로세스의 가상 메모리 영역에 매핑 된 파일의 파일 이름을 찾는 방법이 있습니까?
내가해야할 일은 호출시 프로세스의 가상 주소 공간 통계를보고하는 시스템 호출을 작성하는 것입니다. 이러한 통계는 할당 기준에 따라 프로세스의 가상 주소 공간 크기, 각 가상 메모리 영역의 액세스 권한 및 이러한 가상 메모리 영역에 매핑 된 파일의 이름을 포함해야합니다.
내가 연구 한 첫 두 작품은 적어도 내 연구와 시도가 지금까지 보여준 것부터 가능하지는 않은 것으로 보인다. 나는 그것을 프로세스의 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;
}
이 스레드를 살펴보십시오. http://stackoverflow.com/questions/8250078/how-can-i-get-a-filename-from-a-file-descriptor-inside-a-kernel-module – askb
여기까지입니다. 나는 시작했다. 필자는 솔루션 제안을 구현하려고했지만 files_struct 파일의 출처 또는 파일의 연결 방법을 모릅니다. 그리고 솔루션을 구현하려고 할 때 작성된대로 아무 것도 출력 할 수 없었습니다. – MrMagoo22