procfs代码可以在fs/proc/子目录中找到.如果你打开fs/proc/base.c,你可以找到两个非常相似的数组 - tgid_base_stuff和tid_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.c和fs/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(所有函数都在同一个文件中).