Linux v0.11 task_struct
에는 executable
m_inode *
의 구성원이 있습니다. 나는 비슷한 것을 찾고있다.커널 모듈 내에서 현재 프로세스의 실행 파일의 inode 번호를 얻으려면 어떻게해야합니까?
exec/execve 시스템 호출은이 정보를 어디에도 저장합니까? 아니면 메모리 로딩시 손실됩니까?
Linux v0.11 task_struct
에는 executable
m_inode *
의 구성원이 있습니다. 나는 비슷한 것을 찾고있다.커널 모듈 내에서 현재 프로세스의 실행 파일의 inode 번호를 얻으려면 어떻게해야합니까?
exec/execve 시스템 호출은이 정보를 어디에도 저장합니까? 아니면 메모리 로딩시 손실됩니까?
더 이상 직접 링크가 없습니다. proc_exe_link()
함수는 파일을 매핑하는 작업에서 첫 번째 실행 가능 vma를 찾음으로써이 정보를 얻습니다. 당신이 좋아하는 뭔가 current
을 위해 그렇게 할 것 : 음
struct dentry *dentry = NULL;
struct vfsmount *mnt = NULL;
struct vm_area_struct * vma;
down_read(¤t->mm->mmap_sem);
vma = current->mm->mmap;
while (vma) {
if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file)
break;
vma = vma->vm_next;
}
if (vma) {
mnt = mntget(vma->vm_file->f_path.mnt);
dentry = dget(vma->vm_file->f_path.dentry);
}
up_read(¤t->mm->mmap_sem);
if (dentry) {
/* inode is dentry->d_inode */
}
, 그것은 물론, 손실되지 않습니다. 최근의 리눅스 커널에서는 그것을 추적하는 것이 약간 복잡합니다. 당신에게 지금
mm = get_task_mm(task);
다음
exe_file = get_mm_exe_file(mm);
: 최근의 리눅스 커널에 대한
, 'task_struct 구조체'의 포인터로, 당신은 첫째로는 '구조체 mm_struct'를 얻을 필요 exec 파일의 'struct file'포인터를 'struct file'과 함께 사용하면 inode를 얻을 수 있습니다.struct inode *inode = file->f_path.dentry->d_inode;
BTW, get_mm_exe_file() 정의는
struct file *get_mm_exe_file(struct mm_struct *mm)
{
struct file *exe_file;
/* We need mmap_sem to protect against races with removal of
* VM_EXECUTABLE vmas */
down_read(&mm->mmap_sem);
exe_file = mm->exe_file;
if (exe_file)
get_file(exe_file);
up_read(&mm->mmap_sem);
return exe_file;
}
입니다.