我要观察内核代码以打印/proc/PID/maps
,但无法找到它。谁能告诉我这段代码的位置
答案 0 :(得分:6)
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),
因此,描述此文件上的文件操作的结构称为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,
};
因此,当打开/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
};
所以你对show_pid_map
函数感兴趣,show_map
函数只调用show_map_vma
函数,而函数调用CREATE PROCEDURE [dbo].[uspGetSequentialGuid]
AS
DECLARE @SequentialGuids as Table ( SequentialGuid uniqueidentifier DEFAULT NEWSEQUENTIALID() PRIMARY KEY,InitDate datetime )
BEGIN
INSERT INTO @SequentialGuids(InitDate) Values(GETDATE());
END
SELECT SequentialGuid from @SequentialGuids
GO
(所有函数都在同一个文件中)。
答案 1 :(得分:2)
这是show_pid_map()
中的fs/proc/task_mmu.c
函数(假设您的系统使用MMU,大多数非嵌入式系统就是这种情况)。
一般情况下,/proc/
下的文件代码可以归结为fs/procfs
。