+
尝试通过遵循一些PDF和在线资源来学习/修补Linux内核。
我想使用kmalloc_caches []打印缓存分配,打印cat
/ proc / slabinfo
到目前为止,我已经了解到我在内核版本3.3上实现了s_show
(在/mm/slub.c
中的第5421行)
我理解大部分函数和在其中进行的任何函数调用。但令我困惑的是传递给它的论据。因为,当我搜索调用s_show()
的地方时,这就是我找到的:
static const struct seq_operations slabinfo_op = {
.start = s_start,
.next = s_next,
.stop = s_stop,
.show = s_show,
};
现在,我对这里发生的事情有所了解,但我仍然没有得到论据的来源。
s_show()函数:
static int s_show(struct seq_file *m, void *p)
{
unsigned long nr_partials = 0;
unsigned long nr_slabs = 0;
unsigned long nr_inuse = 0;
unsigned long nr_objs = 0;
unsigned long nr_free = 0;
struct kmem_cache *s;
int node;
s = list_entry(p, struct kmem_cache, list);
for_each_online_node(node) {
struct kmem_cache_node *n = get_node(s, node);
if (!n)
continue;
nr_partials += n->nr_partial;
nr_slabs += atomic_long_read(&n->nr_slabs);
nr_objs += atomic_long_read(&n->total_objects);
nr_free += count_partial(n, count_free);
}
nr_inuse = nr_objs - nr_free;
seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d", s->name, nr_inuse,
nr_objs, s->size, oo_objects(s->oo),
(1 << oo_order(s->oo)));
seq_printf(m, " : tunables %4u %4u %4u", 0, 0, 0);
seq_printf(m, " : slabdata %6lu %6lu %6lu", nr_slabs, nr_slabs,
0UL);
seq_putc(m, '\n');
return 0;
}
答案 0 :(得分:2)
seq_file
参数实际上是您要输出要打印的数据的文件。它是自动构建的。
然而,有趣的是p
参数。要了解它的来源,请参阅以下代码:
static void *s_start(struct seq_file *m, loff_t *pos)
{
loff_t n = *pos;
mutex_lock(&cache_chain_mutex);
if (!n)
print_slabinfo_header(m);
return seq_list_start(&cache_chain, *pos);
}
static void *s_next(struct seq_file *m, void *p, loff_t *pos)
{
return seq_list_next(p, &cache_chain, pos);
}
static void s_stop(struct seq_file *m, void *p)
{
mutex_unlock(&cache_chain_mutex);
}
s_start
和s_next
函数返回作为p
参数给出的内容。您可能需要阅读seq_list_start
和seq_list_next
的代码。