процесс инициализации kallsyms, как работает s_start? - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь выяснить, как работает инициализация kallsyms. из kallsyms. c Я нашел эту структуру

static const struct seq_operations kallsyms_op = {
    .start = s_start,
    .next = s_next,
    .stop = s_stop,
    .show = s_show
}; 

, поэтому я верю, что первая запускаемая функция - это s_start.

static void *s_start(struct seq_file *m, loff_t *pos)
{
    if (!update_iter(m->private, *pos))
        return NULL;
    return m->private;
}

и отсюда update_iter называется. пока здесь все очень понятно. теперь я пытаюсь выяснить, как s_start инициализирует объект iter, чтобы s_show мог его использовать.

Единственная функция, которая вызывается в s_start, это update_iter -

/* Returns false if pos at or past end of file. */
static int update_iter(struct kallsym_iter *iter, loff_t pos)
{
    /* Module symbols can be accessed randomly. */
    if (pos >= kallsyms_num_syms)
        return update_iter_mod(iter, pos);

    /* If we're not on the desired position, reset to new position. */
    if (pos != iter->pos)
        reset_iter(iter, pos);

    iter->nameoff += get_ksymbol_core(iter);
    iter->pos++;

    return 1;
}

и эта функция действительно выглядит как функция инициализации. Я нашел это - https://onebitbug.me/2011/03/04/introducing-linux-kernel-symbols/ статья, объясняющая, как работает update_iter_nod.

Мне не ясна мысль - почему pos >= kallsyms_num_syms верно? как логически (по крайней мере для меня) pos равно 0 при s_start. поэтому update_iter нужно перейти к get_ksymbol_core или reset_iter и вернуть 1 ->, что приведет к возвращению NULL из s_start, и я думаю, что это не так, как оно работает.

почему POS больше / равно чем kallsyms_num_syms?

пытался найти любую читаемую документацию по этой функции, но ничего не нашел в этой строке

...