+
尝试通过关注一些 PDF 和在线资源来学习/修补 Linux 内核。
我想使用 kmalloc_caches[] 打印缓存分配,打印出一些类似于 cat
ing/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;
}
最佳答案
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
的代码。
关于c - 通过创建内核例程打印/proc/slabinfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29235717/