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

Linux kernel 代码引用的/proc/PID/maps在哪里?,linux-kernel,mmu,Linux Kernel,Mmu,我需要观察哪些内核代码才能打印/proc/PID/maps,但找不到这个。有人能告诉我这个代码在哪里吗?它是fs/proc/task\u mmu.c中的show\u pid\u map()函数(前提是您的系统使用mmu,这是大多数非嵌入式系统的情况) 一般来说,/proc/下的文件代码可以是fs/procfs下的原因。procfs代码可以在fs/proc/子目录中找到。如果打开fs/proc/base.c,可以找到两个非常相似的数组-tgid\u base\u stuff和tid\u base\

我需要观察哪些内核代码才能打印
/proc/PID/maps
,但找不到这个。有人能告诉我这个代码在哪里吗?

它是
fs/proc/task\u mmu.c
中的
show\u pid\u map()
函数(前提是您的系统使用mmu,这是大多数非嵌入式系统的情况)


一般来说,
/proc/
下的文件代码可以是
fs/procfs
下的原因。procfs代码可以在
fs/proc/
子目录中找到。如果打开
fs/proc/base.c
,可以找到两个非常相似的数组-
tgid\u base\u stuff
tid\u base\u stuff
。它们分别为
/proc/PID/
/proc/PID/TID/
中的文件注册文件操作函数。所以你对第一个更感兴趣。找到注册
“maps”
文件的文件,如下所示:

REG("maps",       S_IRUGO, proc_pid_maps_operations),
因此,描述此文件上的文件操作的结构称为
proc\u pid\u maps\u operations
。此函数在两个位置定义-
fs/proc/task\u mmu.c
fs/proc/task\u nommu.c
。实际使用哪一个取决于内核配置,但它很可能是第一个

任务\u mmu.c
中,您可以找到结构定义:

const struct file_operations proc_pid_maps_operations =
{
    .open       = pid_maps_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = proc_map_release,
};
因此,当打开
/proc/PID/maps
时,内核将使用
PID\u maps\u open
函数,该函数注册另一组操作:

static const struct seq_operations proc_pid_maps_op = {
    .start  = m_start,
    .next   = m_next,
    .stop   = m_stop,
    .show   = show_pid_map
};
所以您对
show_-pid_-map
函数感兴趣,它只调用
show_-map
函数,然后调用
show_-map_-vma
(都在同一个文件中)