c - 通过创建内核例程打印/proc/slabinfo

标签 c linux linux-kernel

+ 尝试通过关注一些 PDF 和在线资源来学习/修补 Linux 内核。 我想使用 kmalloc_caches[] 打印缓存分配,打印出一些类似于 cating/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_starts_next 函数返回作为p 参数给出的内容。您可能需要阅读 seq_list_startseq_list_next 的代码。

关于c - 通过创建内核例程打印/proc/slabinfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29235717/

相关文章:

java - 用 C 解码 java 序列化 .dat 文件

c - 同步三个进程以按一定顺序打印字母

linux - 用于重命名和重新定位文件的 Shell 脚本

c - "int"之间的区别

c - STDIN_FILENO 和 STDOUT_FILENO 在 c 中只读吗?

c - 从标准库重新定义函数

linux - 如何将内核模块安装到 lib/modules/from Kernel-Source

c - 如何在 xterm 中启用日志记录

linux - Linux 如何确定设备类别?

c - 在 Linux 中,如何在现有类中使用 device_create?