代码在哪里引用/ proc/PID/maps?

Ir *_*r S 2 linux-kernel mmu

我要观察内核代码打印/proc/PID/maps但无法找到这个.有人能告诉我这段代码的位置

Krz*_*ski 6

procfs代码可以在fs/proc/子目录中找到.如果你打开fs/proc/base.c,你可以找到两个非常相似的数组 - tgid_base_stufftid_base_stuff.它们都为文件内部/proc/PID/和文件注册文件操作函数/proc/PID/TID/.所以你对第一个更感兴趣.找到一个注册"maps"文件,它看起来像这样:

REG("maps",       S_IRUGO, proc_pid_maps_operations),
Run Code Online (Sandbox Code Playgroud)

因此,调用描述此文件上的文件操作的结构proc_pid_maps_operations.这个功能在两个地方定义 - fs/proc/task_mmu.cfs/proc/task_nommu.c.实际使用哪一个取决于您的内核配置,但它很可能是第一个.

在里面task_mmu.c,你可以找到结构定义:

const struct file_operations proc_pid_maps_operations =
{
    .open       = pid_maps_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = proc_map_release,
};
Run Code Online (Sandbox Code Playgroud)

因此,当/proc/PID/maps打开时,内核将使用pid_maps_open函数,该函数注册另一组操作:

static const struct seq_operations proc_pid_maps_op = {
    .start  = m_start,
    .next   = m_next,
    .stop   = m_stop,
    .show   = show_pid_map
};
Run Code Online (Sandbox Code Playgroud)

所以你对show_pid_map函数很感兴趣,它只调用show_map函数调用show_map_vma(所有函数都在同一个文件中).