如何在内核模块中获取当前进程可执行文件的inode编号?

时间:2009-11-30 03:08:01

标签: linux-kernel

在Linux v0.11 task_struct中有一个executable成员m_inode *。我正在寻找类似的东西。

exec / execve系统调用是否将此信息存储在任何位置,或者在加载到内存时是否丢失?

2 个答案:

答案 0 :(得分:2)

没有像这样的直接链接了。 proc_exe_link()函数通过查找映射文件的任务中的第一个可执行vma来获取此信息。您可以使用以下内容为current执行此操作:

struct dentry *dentry = NULL;
struct vfsmount *mnt = NULL;
struct vm_area_struct * vma;

down_read(&current->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(&current->mm->mmap_sem);

if (dentry) {
    /* inode is dentry->d_inode */
}

答案 1 :(得分:0)

当然,它并没有丢失。就在最近的Linux内核中,跟踪它有点复杂。

对于最近的Linux内核,使用'struct task_struct'指针,首先需要通过以下方式获取'struct mm_struct':

    mm = get_task_mm(task); 

然后

    exe_file = get_mm_exe_file(mm);

现在你有了指向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;
}